2011-11-29 47 views
2

我收集了一个usertype新闻当前存储在一个NSArray中。我必须将它们存储在UserDefaults中以将它们保存在设备上。新闻有一个独特的属性ID。在将它们存储到UserDefaults之前,我将NSArray转换为NSDictionary,其中的键是ID,此键的对象是News。这是存储它们的好方法吗?用于存储在UserDefaults中的NSArray或NSDictionary?

选择NSDictionary的原因是能够检查每次从Web服务重新下载新闻时,新闻列表中是否存在具有特定ID的新闻。这样我每个新闻ID只有一个新闻实例。我认为这将很难管理使用正常的NSArray - 或者我失去了一些东西?

回答

4

我必须将它们存储在UserDefaults中以将它们保存在设备上。

UserDefaults用于存储首选项,设置和其他“小”位信息,它们不用于存储应用程序数据。你不必“使用”NSUserDefaults,还有很多其他选项可供你使用。例如,以原始格式或使用NSKeyedArchiver/NSKeyedUnarchiver写入文件(在文档目录中)。

你可以得到这样

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
从与新闻IDS存储一个NSDictionary作为键是罚款

除了文档目录路径。我真的没有看到有一个NSArray并将它“转换”为NSDictionary,使用其中一个或另一个(这样你总是确保每个项目只有一个新闻)。

+0

我是否阅读了Apple关于数据存储的指导原则,似乎这些文件应该保存在'/ Library/Caches'而不是'/ Documents'中:http://developer.apple.com/icloud/documentation/数据存储/。这是对的吗? – dhrm

+0

如果您阅读了自己的链接,则表示如果可以重新创建数据,则表示缓存;如果无法重新创建数据,则表示文档。因为缓存数据可以被删除,所以如果它是关键的用户数据,用户将不会感到满意... – jbat100

+1

就我而言,它是从我的WebService下载的新闻对象 - 就像我的数据库的映射。这些数据可以重新下载,所以我认为我的数据应该在'Caches'中。 – dhrm

1

NSUserDefaults不是数据库,但您已经知道它。

无论如何,我会直接存储阵列,并保存最后看到的新闻ID作为单独的偏好。然后,您只需处理ID大于上次看到的项目的新闻项目。当您下载新闻项目时,您需要更新新闻和上次看到的ID。您需要保证ID按升序排列。

根据您对新闻的具体使用情况,一种不同的方法是保存两个数组,一个包含新闻项目,另一个包含新闻ID列表。使用第二个数组检查是否有新消息。

除非你正在处理大量的新闻项目(在这种情况下你应该使用核心数据),你正在优化一些不需要优化的东西。读取,排序,更新并将一个小阵列存回NSUserDefaults的速度相当快。

+0

谢谢!我认为我需要在其他地方存储新闻集合 - 我看到UserDefault并非为此而生。我发现这个指南:http://mobile.tutsplus.com/tutorials/iphone/iphone-core-data/。 这是正确的路要走吗? – dhrm

+0

如果新闻量很小(数百),并且与其他数据片段没有关系,我建议NSKeyedArchiver,因为jbat100在他的回答中告诉你。而且,第一次使用Core Data比第一次更容易。 – djromero

+0

你能否为我提供一个关于如何实现NSKeyedArchiver的教程?我为我的新闻类实现了NSCoding原型,但我需要有关如何将它们存储在设备上的信息。 – dhrm