作者:哓尐_271 | 来源:互联网 | 2023-02-08 19:31
我目前正在学习如何使用CloudKit Framework以及缺少显示如何同步Core Data和CloudKit的文档或示例.
我观看了所有WWDC视频(2014年,2015年,2016年)专门介绍CloudKit,但没有人告诉我们如何实现与Core Data的同步.我找不到任何新的示例,教程或书籍,展示了如何实现此同步.
我知道使用CloudKit的Operations API(不是Convenience API)和订阅更新是有效的,就像在新的WWDC 2016视频中所说的那样,专用于CloudKit,但使用CoreData进行映射是一个真正的问题.
例如,假设我想创建一个类似于Notes应用程序的应用程序.离线时,用户可以创建他的笔记并与他们一起工作,将他们保存到他的核心数据库中.当设备上线时,应用程序会检查服务器上的更改并将新创建的记录保存到服务器(CloudKit).
当应用程序启动时,它还会从CloudKit获取更改,如果有更改,它会使用新更改更新本地缓存(核心数据).
我希望有一个共同的同步模式.在哪里与Core Data方法同步以及它们应该如何?
非常感谢有关此的任何信息或帮助.
我正在使用Swift 3,Xcode 8,iOS 10.
1> Owen Godfrey..:
核心数据已经为用户提供了同步到iCloud的能力.没有必要使用CloudKit.
在iCloud中设计核心数据
但是,使用iCloud的Core Data已被弃用.即便如此,它还没有停产,苹果公司没有立即停止计划,他们只是想阻止它的使用.但它也存在合理化来自多个设备的更新的问题.
无论如何,我一直在研究如何使用云套件来解决这个问题.两个答案; 首先是使用以下内容;
在GitHub缝
第二是手动完成;
设计CloudKit
关键在于Cloud Kit需要记录元数据才能可靠地处理记录更新,因此您必须将该元数据保存在Core Data数据库中.该CKRecord类包含一个方法encodeSystemFields(用:)这将编码这些字段转换为可存储在数据库中的数据记录,然后当你需要恢复CKRecord您可以使用相应的解码器.
无论如何,我即将开始自己这样做.当我拥有它时,我会用更多信息更新它.
自iOS 10起,不推荐使用CoreData iCloud。
2> Jake3231..:
苹果公司最近发布了一份指南,似乎可以回答这个问题。查看Apple 维护CloudKit记录的本地缓存以了解如何在设备上存储CloudKit数据。
虽然本指南未提供要写入设备的示例代码,但确实回答了其余问题。这告诉您如何从CloudKit中获取更改并创建可以存储在设备上的数据。
3> Simon Backx..:
从iOS 13开始,有新的API可以简化开发人员的同步。我建议您观看WWDC19会话,了解CoreData和CloudKit之间的新同步。请注意,这些新API仅适用于iOS 13+。
视频:https : //developer.apple.com/videos/play/wwdc2019/202/
简而言之,您需要开始使用NSPersistentCloudKitContainer
而不是NSPersistentContainer
。这将使同步使用自动冲突解决方案和最后作者获胜的合并策略自动进行。如果您想构建一个运行良好的应用程序,则还需要进行一些修改以改善应用程序的同步。
官方文档可以在以下位置找到:
使用CloudKit设置核心数据
将核心数据存储与CloudKit同步
协作的数据建模(无冲突的复制数据类型)
在会议结束时,他们还展示了一个比默认的“最后作家胜出的合并策略”更好的同步合并的示例。使用因果树可让多个用户编辑同一字符串(并扩展某些类型的其他数据)而不会丢失任何数据。我真的建议大家阅读Archagon的这篇文章,其中描述了它的工作原理和实现方式(也包括CloudKit同步,但不是自动的)。如会话中所示,您还可以通过CoreData和CloudKit之间的新自动同步来实现这一点。