Core data 如何在核心数据和CloudKit之间高效地同步记录

Core data 如何在核心数据和CloudKit之间高效地同步记录,core-data,swift3,ios10,cloudkit,ckoperation,Core Data,Swift3,Ios10,Cloudkit,Ckoperation,我目前正在学习如何使用CloudKit框架,并且缺少说明如何同步核心数据和CloudKit的文档或示例 我观看了所有专门针对CloudKit的WWDC视频(2014、2015、2016),但没有一个告诉我们如何实现与核心数据的同步。我找不到任何新的例子、教程或书籍来说明如何实现这种同步 我知道CloudKit使用Operations API(而非便利API)和订阅新的WWDC 2016视频(专门针对CloudKit)中所述的更改是有效的,但与CoreData的映射是一个真正的问题 例如,假设我想

我目前正在学习如何使用CloudKit框架,并且缺少说明如何同步核心数据和CloudKit的文档或示例

我观看了所有专门针对CloudKit的WWDC视频(2014、2015、2016),但没有一个告诉我们如何实现与核心数据的同步。我找不到任何新的例子、教程或书籍来说明如何实现这种同步

我知道CloudKit使用Operations API(而非便利API)和订阅新的WWDC 2016视频(专门针对CloudKit)中所述的更改是有效的,但与CoreData的映射是一个真正的问题

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

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

我希望有一个共同的同步模式。在哪里放置与核心数据方法的同步,以及它们应该是什么样子

希望您能提供相关信息或帮助


我使用的是Swift 3、Xcode 8和iOS 10。

核心数据已经为用户提供了与iCloud同步的能力。没有必要使用CloudKit

但没错,iCloud的核心数据已经被弃用。即便如此,苹果公司也没有立即停止使用它的计划,他们只是想阻止它的使用。但它也有问题,从多个设备的更新合理化

在任何情况下,我一直在研究如何使用云工具包来实现这一点。两个答案;第一种是使用以下方法

二是手工操作

这里的关键是云工具包需要记录元数据才能可靠地处理记录更新,因此您必须将该元数据保存在核心数据数据库中。该类包含一个方法,该方法将这些字段编码为可存储在数据库中的数据记录,然后在需要恢复该记录时可以使用适当的解码器


不管怎样,我马上就要开始自己动手了。当我有更多信息时,我会更新它。

苹果最近发布了一份指南,似乎可以回答这个问题。查看苹果的,了解如何在设备上存储CloudKit数据


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

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

视频:

简而言之,您需要开始使用
NSPersistentCloudKitContainer
而不是
NSPersistentContainer
。这将使同步工作自动使用自动冲突解决与最后一个writer-wins合并策略。如果你想建立一个好的工作应用程序,你还需要做一些修改,以改善你的应用程序同步

官方文件可在以下网址找到:


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


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

Adelmaer,CloudKit存储有关其拥有的记录、上次更新、上次访问、权限等的元数据。您可以将此数据复制到您的核心数据,并在连接时进行交叉检查,以查看是否有任何更新。你也应该看看这个答案,也许这里有些东西我不能发誓,但我不认为核心数据可以实现iCloud共享,所以如果你需要这个功能,你必须使用CloudKit来实现。自iOS 10以来,CoreData iCloud一直被弃用。我的回答第三行指出了这一点。不过说它从来都不起作用是愚蠢的。但是是的,现在有更好的方法来解决这个问题。@OwenGodfrey你能解释一下“现在有更好的方法来解决这个问题吗”?当前将核心数据与CloudKit同步的最佳实践/方法是什么?似乎在iOS 13中,代码数据被同步到自定义的专用区域,我想知道当我在CloudKit容器上共享记录时会发生什么,它会发生在其他人共享的数据库中吗?它还会与其他用户CloudKit容器同步吗?