在 Swift 中将图像保存到 Core Data 和 iCloud

5
我的应用是一个心情日记,为了保存数据我选择使用Core Data(包括字符串、图片等);为了让用户恢复他的日记,我实现了iCloud,它与Core Data很好地配合。
如果我的条目不多,一切都运行得很好,但当保存的图片太多时,应用程序加载数据缓慢并遇到内存警告。
为了保存我的图片,我选择了Transformable数据类型而不是二进制数据;我知道这不是最好的保存图像的方法(保存URL肯定更好),但我需要在iCloud上同步我的数据,并且将图像保存为Transformable可以让我以简单的方式同步数据(感谢苹果API提供的将Core Data和iCloud链接的可能性)。
我该怎么做才能避免这些内存警告并将我的应用程序图片同步到iCloud?
我考虑过将我的照片保存在自定义照片相册中(如果iCloud为照片应用程序激活,则我的应用程序照片将被同步),但我需要使用自定义名称保存它们,以便从相机卷中检索它们到我的应用程序,目前我没有找到任何保存具有自定义名称的照片的解决方案。
将照片保存在文档目录中(并在我的核心数据实体中保存URL)对于本地数据库来说是正确的选择,但我的应用程序图片将不会被同步。
1个回答

9

你可以尝试以下几种方法来解决问题:

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

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

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

  2. 更改数据模型,使图像保存在不同的实体中,并与当前实体链接。这应该更容易避免在不使用它们时“意外”加载图像。

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

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


1
  1. 如何同步 Core Data 之外的图像?我需要激活“iCloud 文档”吗?如果是,我可以将图像保存在文档目录中并使用自定义名称检索它们吗?
- RiccardoCh
您可以使用iCloud文档来同步图片。为了同步图片,您需要首先将其保存在文档目录中,然后使用NSFileManagersetUbiquitous(_, itemAtURL:, destinationURL:, error:)方法将其移动到iCloud。您还需要使用其他方法(在NSMetadataQueryNSFileManager上)来查找和下载从iCloud中的文件。 - Tom Harrington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接