将图像保存在Core Data中以便在UITableView中使用

时间:2012-07-24 17:28:00

标签: iphone ipad optimization core-data

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

这一切都很容易,我的问题是关于优化。它会有很多内容(可能是1k行)而且它会在UITableView中显示图像,所以核心数据是必须的(考虑到它的延迟加载和其他一些优化)

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

Core Data中存储图像的好处在于db中存储blob的正常撤销。我不知道核心数据会出现多少问题(我在dbs中的经验主要来自MySQL)

另一方面,强硬的“常识”决定只保存名称并获取图像,因为如果他们被要求更多,它会花更多时间,我不确定表现多少这会打。是否有“最佳方式”存储它们?只需输入名称,然后在pathForResourse:ofType:上调用pathForResourse:ofType:inDirectory:或(如果它更快)mainBundle,请存储URI或其他指向它的形式。

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

3 个答案:

答案 0 :(得分:5)

来自Core Data Release Notes for iOS v5.0

  

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

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

另请参阅以下其他问题:

  1. CoreData : store images to DB or not?
  2. Core data images from desktop to iphone
  3. Provide example for why it is not advisable to store images in CoreData?

答案 1 :(得分:1)

只需使用文件名即可获得极佳的优化......

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

你可以做一些分析和检查......但我认为只是一个名字是理想的。 你也可以做一些工作来制作类似于-imageNamed的东西来为你缓存图像,你只需要为你的程序中存在的每个文件制作一个UIImage。

答案 2 :(得分:1)

请勿将图像保存在核心数据中。您可以将有关图像的信息保存在核心数据的有组织内容中,但请将图像保存在项目的支持文件部分中。或者,如果您要下载图像,可以将它们缓存在应用程序的图像部分,只需更新核心数据中图像的信息。