3

我计划构建一个主要内容是图像的应用程序。基本上,它将有多个使用 的菜单UITableViews,其单元格将只有一个图像。当您单击单元格时,您将被推送到一个包含该图像的简单视图和另一个包含其余详细内容的视图。

这一切都很容易做到,我的问题是关于优化的。它会有很多内容(可能有 1k 行)并且会在UITableView.

我的问题是:最好将图像存储在Core Data数据库中(as NSData)还是只存储图像的名称?我想象的是,如果我存储资源的名称,对于UITableView设备中的每一行都必须去获取该图像,处理它最终显示它。当滚动浏览它们时(预计会发生很多),我们会有很多获取图像。如果我将它们存储在 中Core Data,那么就像获取该信息并使用它一样简单,就好像它在图像中一样。

将图像存储在其中的好处是Core Data在数据库中存储 blob 的正常撤回。我不知道这在 Core Data 中会有多大的问题(我在 dbs 方面的经验主要来自 MySQL)

另一方面,强硬的我的“常识”要求只保存名称并在需要时获取图像,如果要求更多,则需要更多时间,我不确定这会对性能造成多大影响是。有没有“最好的方法”来存储它们?只是名称,然后调用pathForResourse:ofType:或(如果它更快)pathForResourse:ofType:inDirectory:mainBundle存储 URI,或其他形式的指向它。

编辑:应用程序将具有随应用程序提供的静态内容,用户将无法以任何方式修改此内容。(至少在 1.0 版中)

4

3 回答 3

5

来自iOS v5.0 的核心数据发行说明

像图像缩略图这样的小数据值可以有效地存储在数据库中,但大照片或其他媒体最好直接由文件系统处理。您现在可以指定托管对象属性的值可以存储为外部记录 - 请参阅 setAllowsExternalBinaryDataStorage:。启用后,Core Data 会根据每个值试探性地决定是直接将数据保存在数据库中还是将 URI 存储到它为您管理的单独文件中。如果使用此选项,则无法根据二进制数据属性的内容进行查询。

setAllowsExternalBinaryDataStorage: 基本上做了你所描述的“......只是存储图像的名称......”

另请参阅这些其他问题:

  1. CoreData:是否将图像存储到数据库?
  2. 从桌面到 iPhone 的核心数据图像
  3. 请举例说明为什么不建议将图像存储在 CoreData 中?
于 2012-07-24T17:38:13.173 回答
1

只需使用文件名,您将获得很好的优化...

如果你重用一个文件......你不必将它存储在数据库中两次,或者有一个模型对象只是为了将该文件表示为关系。

你可以做一些分析和检查......但我认为只有一个名字是理想的。您还可以做一些工作来制作类似于 -imageNamed 的内容,为您缓存图像,并且您只需为每个文件制作一个 UIImage,无论它存在于程序中的任何位置。

于 2012-07-24T17:34:06.793 回答
1

不要将图像保存在核心数据中。您可以将与图像相关的信息保存在核心数据中的有组织的事务中,但将图像有序地保存在项目的支持文件部分中。或者,如果您正在下载图像,您可以将它们缓存在应用程序的图像部分,并简单地更新核心数据中图像的信息。

于 2012-07-24T17:37:40.360 回答