1

在 上viewDidLoad,我的应用程序填充 NSMutableArray arrayOfHaiku,它是一个NSDictionary项目数组,如下所示:

 NSError *error;
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //1
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSString *path = [documentsDirectory stringByAppendingPathComponent:@"haiku.plist"];
 NSFileManager *fileManager = [NSFileManager defaultManager];
 if (![fileManager fileExistsAtPath: path])
 {
 NSString *bundle = [[NSBundle mainBundle] pathForResource:@"haiku" ofType:@"plist"];
 [fileManager copyItemAtPath:bundle toPath: path error:&error];
 }
 self.arrayOfHaiku = [[NSMutableArray alloc] initWithContentsOfFile: path];

在使用应用程序时,用户将项目添加到self.arrayOfHaiku. 截至目前,我在以下代码中包含以下代码viewDidUnload

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //1
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"haiku.plist"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath: path])
{
    [self.arrayOfHaiku writeToFile:path atomically:YES];
}

以下是我的问题:

  1. 我的代码a) 是简单地用新的扩展数组(这是我想要做的)viewDidUnload覆盖存储在 Documents 文件夹中的数组(即在 中访问的数组)的文档,还是 b) 追加viewDidLoad新的、扩展的数组到已经存储在 Documents 文件夹中的数组,这样我最终得到的数组的长度是一堆重复的两倍多?

  2. 如果答案是“b)”,我需要改变什么来做“a)”?

  3. viewDidUnload每次用户将项目添加到 self.arrayOfHaiku 时,是否更好 a) 以我正在执行的方式执行它,或者 b) 扩展文档文件夹中的数组?

  4. 如果答案是“b)”,我需要改变什么来做“b)”?

谢谢你的帮助。

4

1 回答 1

2
  1. 如果文件存在,它将被覆盖,否则将被创建(选项 a)。

  2. 这完全取决于记录的数量。如果你有一个巨大的数字,那么每次重写它们可能会很昂贵。否则,您必须寻找另一种解决方案。老实说,我不建议使用viewDidUnload,因为它在某些情况下可能不会触发,例如,如果应用程序是后台的。

  3. 不幸的是,没有现成的功能可以“更新”带有字典对象的 plist,例如writeToFile:. 您可以使用 NSFileHandler 的fileHandleForUpdatingAtPath:功能,但是您必须手动更改 plist 文件(我认为这不是一个简单的过程)。

我个人会建议使用Core Data,除非您的数据结构非常简单并且“选项 a”不会是一个昂贵的过程。

希望这可以帮助。

于 2012-08-13T19:47:43.470 回答