【问题标题】:Saving images in Core Data for use in UITableView将图像保存在 Core Data 中以供 UITableView 使用
【发布时间】:2012-07-23 02:00:49
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 很小,每个顶部 20kb?它们是包含文本和符号的图像,黑白
  • 如果它们不是太大,那么我不会太担心,除非您可能希望将 blob 放在单独的对象中,以便单独加载元数据。
  • 我发现在处理带有缩略图的 UITableViews 时,将它们存储在数据库中也更方便。与只存储文件名位置是天壤之别,你很快就会遇到延迟加载的问题,而且不好处理。我最近发布了一个image+db机制的应用,没有人抱怨性能。
  • 嗯...我没有仔细阅读,如果您打算将图像存储在包本身中以便在您的应用程序中分发,那么将它们也放在 db 中是没有意义的。
  • 就是这样,我可以将它们打包在数据库中而不是捆绑包中。如果我想说使用应用内购买销售更完整的数据库,它也会更容易

标签: iphone ipad optimization core-data


【解决方案1】:

来自Core Data Release Notes for iOS v5.0

图像缩略图等小数据值可以有效地存储在数据库中,但大照片或其他媒体最好由文件系统直接处理。您现在可以指定托管对象属性的值可以存储为外部记录 - 请参阅 setAllowsExternalBinaryDataStorage:。启用后,Core Data 会根据每个值试探性地决定是否应该将数据直接保存在数据库中,或者将 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?

【讨论】:

【解决方案2】:

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

【讨论】:

    【解决方案3】:

    仅使用文件名您将获得很好的优化...

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

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

    【讨论】:

    • 谢谢,我关心的是 RAM 内存优化而不是存储的使用。而且我几乎从不重复使用这些图像。您能进一步解释一下您的-imageNamed: 想法吗?
    • 如果您关心内存管理,您可以使用 NSCache 来存储图像。 NSCache 将“临时存储具有创建成本高昂的瞬态数据的对象”,并且对象将“在内存紧张时被丢弃。如果被丢弃,则必须在需要时重新计算它们的值”。见:developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
    • -imageNamed 只会在没有缓存的情况下创建一个全新的 UIImage,您可以使用 NSCache 或您自己的实现来做类似的事情。我猜 NSHashMap 不在 IOS 上
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    相关资源
    最近更新 更多