我计划构建一个主要内容是图像的应用程序。基本上,它将有多个使用
UITableViews
的菜单,其单元格将只有一个图像。当您单击该单元格时,您将被推送到一个包含该图像和另一个包含其余详细内容的简单视图。
这一切都很容易做到,我的问题是关于优化。它将有很多内容(可能有 1k 行),并且将在
UITableView
中显示图像,因此核心数据是必须的(考虑到它的延迟加载和其他一些优化)
我的问题是:最好是将图像存储在
Core Data
数据库中(如 NSData
)还是只存储图像的名称?我想象的是,如果我存储资源的名称,对于 UITableView
中的每一行,设备必须获取该图像,对其进行处理并最终显示它。当滚动浏览它们时(预计会发生很多),我们会获取大量图像。如果我将它们存储在 Core Data
中,那么就像获取该信息并像使用图像一样使用它一样简单。
将图像存储在
Core Data
中的好处伴随着在数据库中存储 blob 的正常提取。我不知道这在Core Data中会有多大问题(我在dbs方面的经验主要来自MySQL)
另一方面,根据我的“常识”,仅保存名称并在需要时获取图像,如果请求更多,则会花费更多时间,我不确定性能会受到多大影响这是。有没有“最好的方法”来存储它们?只需名称,然后在
pathForResourse:ofType:
上调用 pathForResourse:ofType:inDirectory:
或(如果更快)mainBundle
,存储 URI 或指向它的其他形式。
编辑:应用程序将具有随应用程序附带的静态内容,用户将无法以任何方式修改此内容。 (至少在1.0版本中)
图像缩略图等小数据值可以有效地存储在数据库中,但大照片或其他媒体最好直接由文件系统处理。您现在可以指定托管对象属性的值可以存储为外部记录 - 请参阅 setAllowsExternalBinaryDataStorage:。启用后,Core Data 会根据每个值试探性地决定是否应将数据直接保存在数据库中或将 URI 存储到它为您管理的单独文件中。如果使用此选项,则无法根据二进制数据属性的内容进行查询。
setAllowsExternalBinaryDataStorage:基本上执行您所描述的“...仅存储图像的名称...”
另请参阅其他问题:
仅使用文件名即可获得巨大的优化...
如果您重复使用一个文件...您不必将其存储在数据库中两次,或者使用模型对象来将该文件表示为关系。
您可以进行一些分析并检查...但我认为只有一个名称是理想的。 您还可以做一些工作来制作类似于 -imageNamed 的东西来为您缓存图像,并且您只需为每个文件制作一个 UIImage,无论它存在于程序中的任何位置。
不要将图像保存在核心数据中。您可以将与图像有关的信息保存在核心数据中的有组织的内容中,但将图像按顺序保存在项目的支持文件部分中。或者,如果您正在下载图像,则可以将它们缓存在应用程序的图像部分中,然后只需更新核心数据中图像的信息即可。