假设我有一个维护联系人的基本iPhone应用程序。我有一个名为“Contact”的实体,它具有“name”,“address”和“photo”属性。应用程序的主视图只是一个表格视图,显示每个联系人的姓名。然后,用户可以单击每个名称以显示相应的照片和地址(在单独的视图控制器中)。
问题是,照片的尺寸非常大。
当我获取托管对象时,它的所有属性是否也被带入内存?在这种情况下,加载应用程序并在表格视图中显示名称可能需要很长时间,因为应用程序也在下面提取所有照片(和地址),对吗?
出于这个原因,你不是说我应该 - 为了使主视图更加活泼(加载应用程序更快) - 制作一个只有“name”属性的新“ContactFacade”实体关系到“联系”实体,其中包含有关该联系人的更多详细信息?
答案 0 :(得分:4)
不是将图像存储在核心数据中,而是将它们作为文件存储在磁盘上,只将文件名存储在核心数据中。
如果您使用UIImage从文件中读取图像,它将自动从ram中移除自身并根据需要将其自身重新加载到ram中。
如果你想要非常好的表现,你应该确保图像更小,或者可能有两种尺寸(拇指和全尺寸)。
另外,请注意您应该使用的图像格式。 PNG将使用更多的磁盘空间,但它需要比JPEG更少的CPU渲染时间。
答案 1 :(得分:1)
核心数据为您找出这些内容 - 它不会获取所有照片等,直到您确实需要显示它们。用户界面不会阻止。
有关优秀示例,请查看iTunes U中的Stanford iOS类,特别是核心数据讲座和核心数据演示(讲座13和14)。他们甚至有一个CoreDataTableViewController,您可以轻松地连接到我在当前项目中使用的FetchResultsController。
http://www.stanford.edu/class/cs193p/cgi-bin/drupal/node/289
那里的示例应用程序不仅可以显示大型照片,还可以从网络中有效地进行。
享受,
达明
答案 2 :(得分:1)
安吉拉卷,
大型BLOB应始终位于“叶子”实体中。 “叶子实体仅包含NSData BLOB和反向关系。这也允许您轻松利用iOS v5 / Mac OS X Lion在文件系统中自动保存BLOB。通过这样做,您可以明确控制何时加载它们。重要的是,通过明智地使用-refreshObject:mergeChanges:
,您可以从内存中强制执行BLOB,也可以强制执行行缓存。这一更改将显着提高您的获取和加载性能。
根据Core Data的大型BLOB文件映射的一个警告是,它不使用内存映射来打开大文件。这将在内存中击中您的居民足迹。当内存警告到来时,你需要显式卸载这些BLOB,它们会来。
安德鲁
答案 3 :(得分:0)
Apple在Core Data Performance页面上有一小部分称为“大数据对象(BLOB)”。感兴趣的部分是:
对于小到中等大小的BLOB(和CLOB),你应该创建一个 单独的数据实体并创建一个到一个关系 属性。
在实施此更改后,我在应用中看到了很好的性能改进。但是,我遇到的情况是,我需要在一个请求中获取300多个对象才能在地图上显示。在您的情况下,您可以使用NSFetchedResultsController
来管理表格中的数据,这会将提取限制为一小部分数据。