【问题标题】:A simple way to make Core Data fetching perform a bit better一种使 Core Data 获取性能更好的简单方法
【发布时间】:2012-02-11 02:03:12
【问题描述】:

假设我有一个维护联系人的基本 iPhone 应用程序。我有一个名为“联系人”的实体,它具有“姓名”、“地址”和“照片”属性。该应用程序的主视图只是一个显示每个联系人姓名的表格视图。然后,用户可以单击每个名称以显示相应的照片和地址(在单独的视图控制器中)。

问题是,照片​​的尺寸可能很大。

难道不是当我获取托管对象时,它的所有属性也会被带入内存吗?在这种情况下,加载应用程序并在表格视图中显示名称可能需要很长时间,因为应用程序也在下方获取所有照片(和地址),对吧?

出于这个原因,你不是说我应该——为了使主视图更快捷(并且应用程序加载更快)——创建一个新的“ContactFacade”实体,它只有“name”属性和与“联系人”实体的关系,其中包含有关该联系人的更多详细信息?

【问题讨论】:

标签: objective-c ios cocoa-touch core-data


【解决方案1】:

不是将图像存储在核心数据中,而是将它们作为文件存储在磁盘上,并且只将文件名存储在核心数据中。

如果您使用 UIImage 从文件中读取图像,它会根据需要自动将自己从 ram 中删除并重新加载到 ram 中。

如果您想要真正好的性能,您应该确保图片更小,或者可能有两种尺寸(拇指和全尺寸)。

另外,请注意您应该使用哪种图像格式。 PNG 将使用更多的磁盘空间,但与 JPEG 相比,它需要更少的 CPU 时间来渲染。

【讨论】:

    【解决方案2】:

    辣酱,

    大型 BLOB 应始终位于“叶”实体中。 “叶实体仅包含 NSData BLOB 和反向关系。这也允许您轻松利用 iOS v5/Mac OS X Lion 在文件系统中的自动 BLOB 保存。通过这样做,您可以明确控制它们何时加载。就像重要的是,通过明智地使用-refreshObject:mergeChanges:,您可以从内存中强制删除 BLOB,并可能从行缓存中强制执行。这一更改将显着提高您的获取和加载性能。

    依赖于 Core Data 对大型 BLOB 的文件映射的一个警告是,它不使用内存映射来打开大文件。这将影响您在内存中的常驻足迹。当内存警告出现时,您需要显式卸载这些 BLOB,它们就会出现。

    安德鲁

    【讨论】:

      【解决方案3】:

      核心数据会为您解决这些问题 - 在您真正需要展示它们之前,它不会获取所有照片等。 UI 不会阻塞。

      例如,查看 iTunes U 中的 Stanford iOS 课程,特别是 Core Data 讲座和 Core Data 演示(第 13 和 14 课)。他们甚至有一个 CoreDataTableViewController,你可以轻松地连接到我在当前项目中使用的 FetchResultsController。

      http://www.stanford.edu/class/cs193p/cgi-bin/drupal/node/289

      那里的示例应用不仅可以显示大照片,还可以通过网络高效地显示。

      享受,

      达米安

      【讨论】:

        【解决方案4】:

        Apple 在其Core Data Performance 页面上有一个小部分,称为“大数据对象 (BLOB)”。感兴趣的部分是:

        对于小到中等大小的 BLOB(和 CLOB),您应该创建一个 数据的单独实体并就地创建一对一关系 属性。

        在实施此更改后,我的应用程序的性能得到了极大的提升。但是,我需要在一个请求中获取 300 多个对象以在地图上显示。在您的情况下,您可以使用 NSFetchedResultsController 来管理表中的数据,这会将获取的数据限制为一小部分数据。

        【讨论】:

          猜你喜欢
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-23
          • 1970-01-01
          • 2015-08-27
          相关资源
          最近更新 更多