22

第一次在这里提问,所以如果我没有提供足够的信息,请放轻松。基本上,我的 iOS 应用程序的一部分允许用户拍摄将存储​​在 Core Data 存储中的照片。该属性是一个 Transformable 类型,我创建了一个 NSManagedObject 子类,我只是使用它来将其图像属性设置为用户提供的新图像。

我知道在 Core Data 中存储大文件是一个坏主意,这就是为什么当我看到 Core Data 实体中图像属性下的“存储在外部记录文件中”选项时我很兴奋。但是,我的应用程序性能却不然,在 iPhone 5 上需要几秒钟才能加载几张图片(我知道这听起来并不多,但考虑到 iPhone 5 的强大功能,旧设备可能需要更长的时间相同的数据)。

我环顾四周,有人说 Store in External Record File 选项仅适用于 OS X 环境,即使它在 iOS 应用程序中可用。但是,我也在 Apple 的“iOS 5 中的新增功能”文档下看到了这一点(它是 Core Data 下的倒数第二项,接近尾声):

托管对象支持两个重要的新特性:有序关系和属性值的外部存储。如果您指定托管对象属性的值可以存储为外部记录,Core Data 会根据每个值试探性地决定是将数据直接保存在数据库中还是将 URL 存储到它管理的单独文件中为你

所以我的问题是,谁是对的?Apple 在为 iOS 应用程序提供此选项时是否犯了一个错误,并且它实际上什么都不做,除非你在 Mac 上,或者它实际上做了什么而我没有以正确的方式配置它,或者它是做它应该做的事情并且性能仍然很差?

我已经看到一些指南解释了如何将大文件(如图像)存储为文件,并将它们的 URL 保存在 Core Data 存储中,但由于这本质上是这个新选项正在做的事情,或者可能应该做的事情,我不确定遵循这些指南是否会有所帮助。

如果以前有人问过这个问题,我真的很抱歉。通常我自己解决这个问题就可以了,但是 Core Data 对我来说是全新的,我仍然不确定我是如何通过初始设置来实现的。感谢您提供的任何帮助!

4

2 回答 2

8

谁是对的?

该类的 iOS 文档集NSAttributeDescription确实提到了allowsExternalBinaryDataStoragesetAllowsExternalBinaryDataStorage:方法,因此 Apple 出错的可能性很小。

你做错了什么还是很慢?

你之前这么说

该属性是可转换类型

但是 Core Data 有一个Binary data类型。也许只有这个与外部存储能力有关。

如果不是这样,我们这里没有足够的信息:

  • 你存储了多少张图片?
  • 它们的尺寸是多少? 
  • 你会自动获取所有图像吗?

此外,Apple 文档指出:

Core Data 启发式地根据每个值做出决定……</p>

  • 您是使用迁移还是从头开始?

您可以查看应用程序的沙箱,看看您的图片是否真的保存在 CoreData 之外。

希望这可以帮助。

于 2013-05-07T10:54:44.483 回答
3

好问题!

查看这篇文章: 使用内置 CoreData 选项将 blob 存储在外部位置

显然它应该工作。您还应该在模拟器中尝试它并检查应用程序数据文件夹,以查看文件夹是否按照描述创建(~/Library/Application Support/iPhone Simulator/... - 您将找出路径的其余部分)。您也可以使用 sqlite3 命令检查 sqlite 文件,以查看二进制数据是否在数据库中。

我没有亲自使用过这个选项,因为我更愿意手动将图像保存在文件夹中,并将对它们的引用存储在数据库中。这样,从要显示的文件创建 UIImage 对象会更容易,可以更好地控制去哪里等等。不过会需要一些额外的劳动力!

希望对您有所帮助。

于 2013-05-07T16:24:22.157 回答