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

Ric*_*oCh 5 image core-data ios icloud swift

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

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

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

我该怎么做才能避免此内存警告并在 iCloud 上同步我的应用程序图片?

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

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

Tom*_*ton 8

您可以尝试一些方法。

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

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

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

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

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

在这个列表中,#1 是最简单的,但可能影响最小。使用 #3 应该非常有效,但需要做最多的工作。