35

我目前正在学习如何使用 CloudKit 框架,但缺乏说明如何同步 Core Data 和 CloudKit 的文档或示例。

我看过所有专门用于 CloudKit 的 WWDC 视频(2014、2015、2016),但没有一个视频告诉我们如何实现与 Core Data 的同步。我找不到任何新的示例、教程或书籍来展示如何实现这种同步。

我知道使用 CloudKit 的操作 API(不是便利 API)并订阅更改是有效的,正如它在新的 WWDC 2016 视频中所说的那样,专用于 CloudKit,但与 CoreData 的映射是一个真正的问题。

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

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

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

将不胜感激有关此的任何信息或帮助。

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

4

3 回答 3

20

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

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

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

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


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

在会议结束时,他们还演示了一个比默认的“last-writer-wins merge strategy”更好的同步合并示例。因果树的使用允许多个用户编辑相同的字符串(以及在某种程度上扩展其他类型的数据)而不会丢失任何数据。我真的建议大家阅读Archagon 的这篇文章,该文章描述了它是如何工作的以及如何实现它(也使用 CloudKit 同步,但不是新的自动同步)。正如会话中所展示的,您还可以通过 CoreData 和 CloudKit 之间的新自动同步来实现这一点。

于 2019-06-16T13:20:13.767 回答
11

Core Data 已经为用户提供了同步到 iCloud 的能力。无需使用 CloudKit。

iCloud 中的核心数据设计

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

无论如何,我自己一直在研究如何使用 cloud kit 做到这一点。两个答案;首先是使用以下内容;

缝在 GitHub

第二种是手动完成;

为 CloudKit 设计

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

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

于 2017-06-28T10:49:01.930 回答
8

Apple 最近发布了一份指南,似乎可以回答这个问题。查看 Apple 的维护 CloudKit 记录的本地缓存,了解如何在设备上存储 CloudKit 数据。

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

于 2018-02-24T13:57:50.573 回答