iOS - 在内存中保存用户最喜欢的对象列表的最佳方法

时间:2017-03-13 18:50:16

标签: ios objective-c core-data save nsuserdefaults

我正在制作一个显示建筑照片的应用程序以及有关它们的一些信息。这些照片都是应用程序包中的jpeg,与它们相关联的 Building 对象有一些属性,如名称,地址,当然还有照片数组。我在应用启动时从plist加载 Building 对象。一切都非常直接,除了当用户滚动建筑物的图像时,他们可以选择将他们喜欢的那些添加到喜欢的列表中以供稍后查看。

最初我打算使用Core Data保存他们所喜欢的每个 Building 对象,但是现在我考虑它似乎有点多余,因为所有 Building 对象已经从plist加载。当用户滚动每个建筑物的图像时,照片必须显示已经将建筑物添加到喜爱的列表中的天气的指示,这意味着我将不得不连续地比较对象的数组。从CoreData中取出一个从plist加载的对象数组,看起来它可能是一个内存浪费任务。

我想知道,作为CoreData的替代方案,我是否可以为 Building 对象添加一个唯一的ID属性,并将其存储在plist中。然后,当用户将 Building 添加到他们的收藏夹列表中时,我可以将它的UID添加到NSUSerDefaults中的数组中并以此方式进行比较。这似乎是解决这个问题的合理方法吗?

3 个答案:

答案 0 :(得分:1)

NSUserDefaults中存储这样的数据是一个非常糟糕的习惯。将用户首选项保存在NSUserDefaults中,而不是数据集。

更好的想法是将用户的收藏夹保存在Documents文件夹中的文件中。如果您已添加" ID属性"在您的Building对象中,您可以维护一组选定的ID。可以使用以下命令将该数组保存到磁盘并从磁盘读取:

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [documentPaths objectAtIndex:0];
NSString *myFile = [documentsDirectory stringByAppendingPathComponent:@"myFavs"];

然后

// save the array contents to file named "myFavs"
[a writeToFile:myFile atomically:YES];

// read the saved array when you launch the app
NSArray *b = [NSArray arrayWithContentsOfFile:myFile];

当然,您希望添加错误处理,但这比将数组填充到NSUserDefaults要好得多。

答案 1 :(得分:0)

也许使用CoreData作为收藏夹是可以的,但是,考虑使用在同一个集合中存储相同类型的不同值而没有定义排序的集合

答案 2 :(得分:0)

假设: - 您的建筑物数据不是来自动态/外部来源 - 你没有大量的数据。

为什么不向建筑物添加属性以将其标记为收藏,并在应用程序转到后台时将其存储在本地。 (NSUserDefaults或文件目录为plist)?然后在将来的应用程序加载中使用具有标志的本地加载。

这样您就不需要额外的数据结构来存储标识符和收藏列表。

对于您正在描述的问题,CoreData似乎有些过分。