NSCoding - 将数组保存到文件或nsdefaults

时间:2015-03-10 18:47:14

标签: ios arrays nscoding

下午所有,

使用我的第一个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];
}

这是我尝试使用它的主要类。

    //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个字符串。

我做了什么明显的错误?

1 个答案:

答案 0 :(得分:2)

你正在努力。

如果要保存的只是NSArrays和NSStrings,则不需要添加NSCoding,这些类型已经符合NSCoding。只需存档到文件或“颤抖”保存到NSUserDefaults“/ shudder”。

最好创建一个Data Model类,并使用NSArchiver从Documents目录中的文件进行保存和恢复。