在 Core Data + iCloud 中保存图像 - Swift

Save images in Core Data + iCloud - Swift

我的应用程序是一本心情日记,为了保存我选择使用 Core Data 的数据(用于字符串、图像等);为了允许用户恢复他的日记我已经实现了 iCloud,它与 Core Data 配合得很好。

如果我没有太多条目,一切都很好,但是当保存的图像太多时,应用程序加载数据很慢并且遇到内存警告。

为了保存图像,我选择了可​​转换数据类型而不是二进制数据;我知道这不是保存图像的最佳方式(保存 url 肯定更好),但我需要在 iCloud 上同步我的数据,将图像保存为 Transformable 允许我以简单的方式同步数据(感谢Apple Api 为 link Core Data 和 iCloud 提供的可能性)。

如何避免此内存警告并在 iCloud 上同步我的应用程序图片?

我考虑过将我的照片保存在自定义相册中的可能性(如果 iCloud 为照片应用程序激活,我的应用程序图片将被同步),但我需要使用自定义名称保存它们以便从相机中检索它们滚动到我的应用程序,目前我没有找到任何解决方案来在自定义相册中保存带有自定义名称的图片。

将照片保存在文档目录中(并将 url 保存在我的核心数据实体中)将是本地数据库的正确选择,但我的应用程序图片不会同步。

您可以尝试一些方法。

首先,添加图像缩略图 属性,用于存储图像的较小版本。尽可能使用它。加载一堆全尺寸照片需要大量内存,因此只要 UI 允许较小的尺寸,请改为加载较小的图像。

除此之外,您还可以使用以下策略之一更改处理图像的方式。按复杂性(和有效性)的升序排列:

  1. 确保已为数据模型中的图像 属性 启用 "Allows external storage"。这将使 Core Data 将图像放在持久存储之外,而无需您管理这些文件。这将节省内存,例如,如果您有时获取数据但不使用图像 属性.

  2. 更改数据模型,使图像保存在不同的实体中,并通过关系将其链接到您当前的实体。这应该可以更轻松地避免 "accidentally" 在您不使用图像时加载图像。

  3. 将图像放在单独的文件中,只保留文件名在 Core Data 中。您仍然可以通过 iCloud 同步图像,因为您可以在 Core Data 之外通过 iCloud 直接同步文件。但是您需要额外的代码来管理 uploading/downloading 图像。您还需要确保您可以处理 Core Data 已完成同步但图像尚不可用的情况。

在此列表中,#1 最简单,但可能效果最小。使用 #3 应该非常有效,但需要最多的工作。