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 - 将用户最喜欢的对象列表保存在内存中的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

在文件中存储对象/充满对象的地图的最简单方法是啥?

将 Access 2003 列表框行源(查询)导出到 Excel 2003 的最有效方法

重命名列表数据框中元素的最有效方法

在 Core Data 中只保存部分对象

在android中保存该数据的最合适方法是啥

Java - 从列表/数组中的每个对象获取单个属性的最简单方法?