【问题标题】:NSCoding - saving array to file or nsdefaultsNSCoding - 将数组保存到文件或 nsdefaults
【发布时间】:2015-03-10 18:47:13
【问题描述】:

下午好,

正在开发我的第一个 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 个字符串。

我做错了什么?

【问题讨论】:

  • 谢谢 zaph... 第一个问题.. 你为什么说 保存到 nsuserdefaults... 这样做不好吗?

标签: ios arrays nscoding


【解决方案1】:

你在努力。

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

创建一个数据模型类并使用 NSArchiver 从 Documents 目录中的文件保存和恢复确实更好。

【讨论】:

  • 为什么 nsuserdefaults 是一个不好的选择?如果我不需要添加 nscoding... 什么时候添加合适?
  • 你可以,但这不是一个好主意。请注意,除其他外,它基于基于字符串的键,因此没有类型检查。可以从连接的计算机轻松访问它。有一个额外的步骤可以知道该项目是否存在,这是 BOOL 的一个特殊问题。它受制于“破窗”综合症。相反,只需使用数据模型并将其保存到使用 NSArchiver 的文件中并从文件中恢复。这很有效,因为更多的项目被添加到数据模型/数据模型类可以提供NSUserDefaults 条目无法提供的功能。
  • 还是有点糊涂……什么时候需要添加nscoding?
  • 何时使用 NSArchiver。但请注意,许多 Apple 类已经符合 NSCoding 或 NSSecureCoding。在“符合”下查看 Apple 文档。
  • Apple:NSUserDefaults 类提供了一个与默认系统交互的编程接口。默认系统允许应用程序自定义其行为以匹配用户的偏好。例如,您可以允许用户确定应用程序显示的测量单位或自动保存文档的频率。应用程序通过将值分配给一组参数来记录此类偏好。这些参数被称为默认值,因为它们通常用于确定应用程序在启动时的默认状态或默认行为方式。
猜你喜欢
  • 1970-01-01
  • 2021-05-01
  • 2012-07-02
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 2021-05-25
相关资源
最近更新 更多