我正在使用NSPersistentCloudKitContainer
CloudKit 在不同设备之间同步数据。它适用于新项目,但是当我将它与旧项目一起使用时,添加的旧数据NSPersistentContainer
不会同步。
我想要实现的是将旧数据NSPersistentContainer
更改为NSPersistentCloudKitContainer
. 可能吗?
我正在使用NSPersistentCloudKitContainer
CloudKit 在不同设备之间同步数据。它适用于新项目,但是当我将它与旧项目一起使用时,添加的旧数据NSPersistentContainer
不会同步。
我想要实现的是将旧数据NSPersistentContainer
更改为NSPersistentCloudKitContainer
. 可能吗?
我找到了一个适用于我的核心数据数据库的解决方案 - 我的解决方案非常复杂,具有多个多对多关系(一个名为 Somnus 的手术/麻醉日志应用程序)
我首先为我调用的所有核心数据实体创建一个新属性,sentToCloud
并在核心数据模型中将其设置为FALSE
默认值。
在现有用户的第一次加载时:
"sentToCloud == FALSE"
使用每个实体类型的谓词获取请求sentToCloud
为TRUE
每个对象,然后保存 MOCNSPersistentCloudKitContainer
开始同步我已经按照适用于我的数据库的“优先级”顺序完成了此操作,假设 iCloud 同步会话与修改核心数据的顺序相匹配。在我的测试中,情况似乎是这样:
NSPersistentCloudKitContainer
我同步用户最后与之交互的对象,一旦其他一切都到位,因此关系完好无损,并且在我们等待重新连接所有关系时,他们不认为他们的数据是无聊的CKAsset
幕后),因为它不是我数据库中最重要的部分我的数据库从我的 iPad 成功同步到 iPhone,所有关系和二进制数据都显示正确。
现在我需要的是一种方法来告诉用户数据何时同步(和/或某种进度),并让他们完全关闭它。
附录
因此,在重置 iCloud 仪表板上的所有数据并删除我的 iPhone 和 iPad 上的应用程序后,我再次尝试了此操作。
第二次只同步了一些数据。.limitExceeded
处理大型同步请求(控制台中有很多 CKErrors)似乎仍然存在问题。
令人沮丧的是,目前尚不清楚它是否会破坏重试请求 - 我认为不是。我已经把它留了一夜,仍然没有进一步同步,只有更多.limitExceeded
的 CKErrors。
也许这就是他们不想同步现有数据的原因?
就个人而言,我认为这很愚蠢。有时用户会对他们的数据进行批处理,这将涉及在一次操作中更新数千个 Core Data 对象。如果这只是被.limitExceeded
CKErrors卡住,那NSPersistentCloudKitContainer
将不是一个很好的同步解决方案。
他们需要一种更好的方法来处理这些错误(将请求分解为更小的请求),以及查看正在发生的事情的能力(并且可能向用户呈现一些 UI)。
我真的需要它来工作,因为就目前而言,没有办法使用 CloudKit 同步多对多核心数据关系。
我只是希望他们仍然在这个类上工作并改进它。