iOS - 将用户最喜欢的对象列表保存在内存中的最佳方式
Posted
技术标签:
【中文标题】iOS - 将用户最喜欢的对象列表保存在内存中的最佳方式【英文标题】:iOS - Best way to save a list of user's favourite objects in memory 【发布时间】:2017-03-13 18:50:16 【问题描述】:我正在开发一个应用程序,该应用程序显示建筑物的照片以及有关它们的一些信息。这些照片都是 jpeg,都包含在应用程序包中,与它们关联的 Building 对象具有一些属性,例如名称、地址,当然还有照片数组。当应用程序启动时,我正在从 plist 加载 Building 对象。一切都非常简单,除了当用户滚动浏览建筑物的图像时,他们可以选择将他们喜欢的图像添加到收藏夹列表中以供以后查看。
最初我打算使用 Core Data 保存他们喜欢的每个 Building 对象,但现在我想这似乎有点多余,因为所有 Building 对象已经从 plist 加载。当用户滚动浏览每个建筑物的图像时,照片必须显示天气指示,该建筑物已添加到收藏夹列表中,这意味着我必须不断比较从 CoreData 获取的对象数组与数组从 plist 加载的对象的数量,这似乎是一项浪费内存的任务。
我想知道,作为 CoreData 的替代方案,我是否可以将唯一 ID 属性添加到 Building 对象并将其与它们一起存储在 plist 中。然后,当用户将 Building 添加到他们的收藏夹列表时,我可以将它的 UID 添加到 NSUSerDefaults 中的数组中并以这种方式进行比较。这似乎是解决这个问题的明智方法吗?
【问题讨论】:
是的,NSUserDefaults 会按照您的描述完美运行。 【参考方案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 中要好得多。
【讨论】:
【参考方案2】:也许将 CoreData 用于收藏夹是可以的,不过,请考虑使用 Sets 将相同类型的不同值存储在没有定义排序的集合中
【讨论】:
【参考方案3】:假设: - 您的建筑物数据并非来自动态/外部来源 - 你没有大量的数据。
为什么不向建筑物添加一个属性以将其标记为收藏,并在应用程序进入后台时存储该本地属性。 (NSUserDefaults 或文件目录作为 plist)?。然后在未来的应用程序加载使用具有标志的本地应用程序。
这样您就不需要额外的数据结构来存储标识符和收藏夹列表。
CoreData 对于您所描述的问题似乎有点矫枉过正。
【讨论】:
以上是关于iOS - 将用户最喜欢的对象列表保存在内存中的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章