NSCoding - 将数组保存到文件或 nsdefaults
NSCoding - saving array to file or nsdefaults
大家下午好,
正在开发我的第一个 iphone 应用程序。
我正在尝试将数组的数组保存到文件或 nsuserdefaults。
数据是这样的...
MainArray(包含以下 3 个数组)
Array1(包含 3 个字符串)
Array2(包含 3 个字符串)
Array3(包含 3 个字符串)
到目前为止,我一直在阅读有关将内容保存到 nsuserdefaults 和保存到文件的内容。不确定哪个是正确的方法或两者的好处,但我开始尝试保存到文件。
下面是我自定义的保存信息的对象。
@implementation UserSettingsClass
+ (instancetype)sharedUserData{
static id sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [self loadInstance];
//sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
-(void)encodeWithCoder:(NSCoder *)encoder{
[encoder encodeObject:self.arrayUserSettings forKey:@"someArray"];
[encoder encodeObject:self.userDescription forKey:@"testDesc"];
}
- (id)initWithCoder:(NSCoder *)decoder{
if ((self = [super init])){
self.userDescription = [decoder decodeObjectForKey:@"testDesc"];
self.arrayUserSettings = [decoder decodeObjectForKey:@"someArray"];
}
return self;
}
+(NSString *)filePath{
static NSString *filePath = nil;
if (!filePath){
filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"gamedata"];
}
return filePath;
}
+(instancetype)loadInstance{
NSData *decodedData = [NSData dataWithContentsOfFile:[UserSettingsClass filePath]];
if (decodedData){
UserSettingsClass *gameData = [NSKeyedUnarchiver unarchiveObjectWithData:decodedData];
return gameData;
}
return [[UserSettingsClass alloc] init];
}
-(void)save{
NSData *encodedData = [NSKeyedArchiver archivedDataWithRootObject:self];
[encodedData writeToFile:[UserSettingsClass filePath] atomically:YES];
}
这是我尝试使用它的主要 class。
//initialize variables
//_userArray = [[NSMutableArray alloc] init];
//_userDescription = [[NSString stringWithFormat:@"testDescription"] init];
//_userLoginID = [[NSString stringWithFormat:@"testLogin"] init];
//_userPW = [[NSString stringWithFormat:@"testPassword"] init];
// [_userArray addObject:[UserSettingsClass sharedUserData].userDescription];
//[_userArray addObject:_userLoginID];
//[[UserSettingsClass sharedUserData].arrayUserSettings addObject: [UserSettingsClass sharedUserData].userDescription];
NSMutableArray *tempArray = [UserSettingsClass sharedUserData].arrayUserSettings;
//[_userArray addObject:_userPW];
//save data to shared singleton class
//[[UserSettingsClass sharedUserData].arrayUserSettings addObject:_userArray];
//NSMutableArray *tempArray = [[NSMutableArray alloc] init];
//tempArray = [UserSettingsClass sharedUserData].arrayUserSettings;
//[UserSettingsClass sharedUserData].highScore = 10;
//int i = [UserSettingsClass sharedUserData].highScore;
//[UserSettingsClass sharedUserData].userDescription = @"hello";
NSString *temp2 = [UserSettingsClass sharedUserData].userDescription;
我可以保存单个字符串,但我一定是做错了什么。
我保存的单个字符串只是为了看看我是否可以让它工作。我的目标是将主数组保存到文件(或 nsuserdefaults),其中包含大约 3 个对象(数组)...并且每个数组都包含 3 个字符串。
我做错了什么吗?
你在努力
如果你想要保存的只是NSArrays和NSStrings,你不需要添加NSCoding,这些类型已经符合NSCoding。只需存档到文件或 "shudder" 保存到 NSUserDefaults "/shudder".
创建一个数据模型 class 并使用 NSArchiver 从 Documents 目录中的文件保存和恢复确实更好。
大家下午好,
正在开发我的第一个 iphone 应用程序。
我正在尝试将数组的数组保存到文件或 nsuserdefaults。
数据是这样的...
MainArray(包含以下 3 个数组) Array1(包含 3 个字符串) Array2(包含 3 个字符串) Array3(包含 3 个字符串)
到目前为止,我一直在阅读有关将内容保存到 nsuserdefaults 和保存到文件的内容。不确定哪个是正确的方法或两者的好处,但我开始尝试保存到文件。
下面是我自定义的保存信息的对象。
@implementation UserSettingsClass
+ (instancetype)sharedUserData{
static id sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [self loadInstance];
//sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
-(void)encodeWithCoder:(NSCoder *)encoder{
[encoder encodeObject:self.arrayUserSettings forKey:@"someArray"];
[encoder encodeObject:self.userDescription forKey:@"testDesc"];
}
- (id)initWithCoder:(NSCoder *)decoder{
if ((self = [super init])){
self.userDescription = [decoder decodeObjectForKey:@"testDesc"];
self.arrayUserSettings = [decoder decodeObjectForKey:@"someArray"];
}
return self;
}
+(NSString *)filePath{
static NSString *filePath = nil;
if (!filePath){
filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"gamedata"];
}
return filePath;
}
+(instancetype)loadInstance{
NSData *decodedData = [NSData dataWithContentsOfFile:[UserSettingsClass filePath]];
if (decodedData){
UserSettingsClass *gameData = [NSKeyedUnarchiver unarchiveObjectWithData:decodedData];
return gameData;
}
return [[UserSettingsClass alloc] init];
}
-(void)save{
NSData *encodedData = [NSKeyedArchiver archivedDataWithRootObject:self];
[encodedData writeToFile:[UserSettingsClass filePath] atomically:YES];
}
这是我尝试使用它的主要 class。
//initialize variables
//_userArray = [[NSMutableArray alloc] init];
//_userDescription = [[NSString stringWithFormat:@"testDescription"] init];
//_userLoginID = [[NSString stringWithFormat:@"testLogin"] init];
//_userPW = [[NSString stringWithFormat:@"testPassword"] init];
// [_userArray addObject:[UserSettingsClass sharedUserData].userDescription];
//[_userArray addObject:_userLoginID];
//[[UserSettingsClass sharedUserData].arrayUserSettings addObject: [UserSettingsClass sharedUserData].userDescription];
NSMutableArray *tempArray = [UserSettingsClass sharedUserData].arrayUserSettings;
//[_userArray addObject:_userPW];
//save data to shared singleton class
//[[UserSettingsClass sharedUserData].arrayUserSettings addObject:_userArray];
//NSMutableArray *tempArray = [[NSMutableArray alloc] init];
//tempArray = [UserSettingsClass sharedUserData].arrayUserSettings;
//[UserSettingsClass sharedUserData].highScore = 10;
//int i = [UserSettingsClass sharedUserData].highScore;
//[UserSettingsClass sharedUserData].userDescription = @"hello";
NSString *temp2 = [UserSettingsClass sharedUserData].userDescription;
我可以保存单个字符串,但我一定是做错了什么。 我保存的单个字符串只是为了看看我是否可以让它工作。我的目标是将主数组保存到文件(或 nsuserdefaults),其中包含大约 3 个对象(数组)...并且每个数组都包含 3 个字符串。
我做错了什么吗?
你在努力
如果你想要保存的只是NSArrays和NSStrings,你不需要添加NSCoding,这些类型已经符合NSCoding。只需存档到文件或 "shudder" 保存到 NSUserDefaults "/shudder".
创建一个数据模型 class 并使用 NSArchiver 从 Documents 目录中的文件保存和恢复确实更好。