我正在开发一个将核心数据与iCloud结合使用的应用程序(iOS7给出了很大的改进)。此应用程序存储数据以使用此信息描述任务:
name
一个NSString
date
一个NSDate
image
一个NSString
,描述了图片的路径顺便说一下,图片可以存储在文档或图书馆目录中(我必须决定哪个是更方便的文件夹),在同一个具有唯一名称的文件夹中。
现在我想为图像激活iCloud同步,否则用户的体验将不完整(我只是同步数据库数据..没有图像,应用程序的奇怪/错误行为)。
我对Apple文档感到困惑。我无法找到一种方法来准确理解iCloud数据如何满足这种需求。我只想在创建文件夹时立即同步它们的每个文件。所以我的问题是:
注意:我知道我可以通过在文档文件夹中添加文件来同步数据,并希望用户激活文档同步...但这显然不是我想要的。
答案 0 :(得分:5)
在同一个应用程序中同时使用Core Data事务日志同步和基于文件的同步来实现您想要实现的目标非常简单。
因此,您需要设置Core Data堆栈以使用iCloud选项并通过iCloud同步数据更改。同时,您可以将图像存储在Apps iCloud容器中,以便它们同步。请记住,您需要对Core Data fileURL中的图像使用相对引用,因为完整路径名将根据运行应用程序的设备而有所不同。因此,例如,您只需将图像文件名存储在Core Data中,并使用标准目录(如“iCloudContainer / Documents / Images /”)来存储它们。 'iCloudContainer'是您通过调用[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:]
API获得的网址。
我上传了使用iCloud进行事务日志同步(即同步Core Data中的数据)的示例Core Data应用程序,以及使用文件同步在iCloud中存储Core Data备份文件,然后可以由任何设备访问。您应该能够使用相同的代码将iRoud的备份文件移动到iCloud或从iCloud移动备份文件。请记住,您必须先触发从iCloud下载文件,然后才能通过协调读取或使用NSFileManager初始化下载来使用它们。
下载并运行示例应用程序,并使用内置的备份文件管理器制作备份文件,并使用不同的设备将它们复制到iCloud和从iCloud复制。然后在存储图像文件时使用相同的代码。
您的应用程序必须处理用户更改iCloud帐户,登录或退出iCloud等内容,并相应地移动核心数据文件和图像文件。
答案 1 :(得分:2)
自动发生这种情况的唯一方法是在模型中为图像创建二进制数据属性。如果这样做,您可能需要检查外部二进制存储允许选项,因此照片最终存储为文件而不是数据库。
如果您希望将照片存储在商店外部,则必须完成更多工作。例如,您需要使用NSFileManager方法自己将照片迁移到iCloud容器中。如果您觉得更容易,也可以使用类似iCloud Access的类。
自己处理照片的缺点是,当核心数据存储同步时,您永远无法确定它们是否已全部到达您的设备,因此可能会丢失一张或多张照片,即使它们有条目在商店。您必须确保您的应用可以处理此方案,可能会显示占位符图片,直到可以访问真实照片。
在一个应用中使用核心数据和文档同步没有问题。事实上,它们在封面下完全相同。从iClouds的角度来看,它们都只是要传输的文件。