如何有效地同步Core Data和CloudKit之间的记录

时间:2017-03-15 21:08:07

标签: core-data swift3 ios10 cloudkit ckoperation

我目前正在学习如何使用CloudKit Framework以及缺少显示如何同步Core Data和CloudKit的文档或示例。

我观看了所有WWDC视频(2014年,2015年,2016年)专门介绍CloudKit,但没有一个人告诉我们如何实现与Core Data的同步。我找不到任何新的示例,教程或书籍,展示了如何实现此同步。

我知道使用CloudKit的Operations API(不是Convenience API)和订阅更新是有效的,就像在专注于CloudKit的新WWDC 2016视频中所说的那样,但使​​用CoreData进行映射是一个真正的问题。

例如,假设我想创建一个类似于Notes应用的应用。离线时,用户可以创建他的笔记并与他们一起工作,将他们保存到他的核心数据库中。当设备上线时,应用程序会检查服务器上的更改并将新创建的记录保存到服务器(CloudKit)。

当应用程序启动时,它还会从CloudKit获取更改,如果有更改,它会使用新更改更新本地缓存(Core Data)。

我希望有一个共同的同步模式。在哪里与Core Data方法进行同步以及它们应该是什么样的?

非常感谢有关此的任何信息或帮助。

我正在使用Swift 3,Xcode 8,iOS 10。

3 个答案:

答案 0 :(得分:10)

Core Data已经为用户提供了同步到iCloud的功能。没有必要使用CloudKit。

Design For Core Data In iCloud

但是,使用iCloud的Core Data已被弃用。即便如此,它还有not been discontinued,苹果没有立即停止计划,他们只是想阻止它的使用。但它也存在合理化来自多个设备的更新的问题。

无论如何,我一直在研究如何使用云套件来解决这个问题。两个答案;首先是使用以下内容;

Seam in GitHub

第二种是手动完成;

Designing for CloudKit

这里的关键是Cloud Kit需要记录元数据才能可靠地处理记录更新,因此您必须将这些元数据保存在Core Data数据库中。 CKRecord类包含一个方法encodeSystemFields(with:),它将这些字段编码为可以存储在数据库中的数据记录,然后当您需要恢复CKRecord时,您可以使用适当的解码器。

无论如何,我即将开始自己这样做。当我拥有它时,我会用更多信息更新它。

答案 1 :(得分:4)

Apple最近发布了一个似乎回答这个问题的指南。查看Apple的Maintaining a Local Cache of CloudKit Records,了解如何在设备上存储CloudKit数据。

虽然本指南未提供写入设备的示例代码,但它确实回答了问题的其余部分。这告诉您如何从CloudKit获取更改并创建可以存储在设备上的数据。

答案 2 :(得分:4)

从iOS 13开始,有新的API可以简化开发人员的同步。我建议您观看WWDC19会话,了解CoreData和CloudKit之间的新同步。请注意,这些新API仅适用于iOS 13 +。

视频:https://developer.apple.com/videos/play/wwdc2019/202/

简而言之,您需要开始使用NSPersistentCloudKitContainer而不是NSPersistentContainer。这将使同步使用自动冲突解决方案和最后作者获胜的合并策略自动进行。如果您想构建一个运行良好的应用程序,则还需要进行一些修改以改善应用程序的同步。

官方文档可在以下位置找到:


用于协作的数据建模(无冲突的复制数据类型)

在会议结束时,他们还展示了一个比默认的“最后写者胜出合并策略”更好的同步合并示例。 因果树的使用使多个用户可以编辑同一字符串(并扩展某些类型的其他数据)而不会丢失任何数据。我真的建议大家阅读 this article from Archagon ,其中描述了它的工作原理和实现方式(也适用于CloudKit同步,但不适用于新的自动同步)。如本次会议所述,您还可以通过CoreData和CloudKit之间的新自动同步来实现这一点。