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

时间:2015-08-04 10:19:52

标签: ios image swift core-data icloud

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

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

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

我可以做些什么来避免此内存警告并在iCloud上同步我的应用图片?

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

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

1 个答案:

答案 0 :(得分:4)

您可以尝试一些事项。

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

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

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

  2. 更改数据模型,以便将图像保存在不同的实体中,并将​​关系链接到当前实体。这样可以更容易避免"意外"在您不使用图片时加载图片。

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

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