ios - 使用 NSPersistentCloudKitContainer 同步旧数据

标签 ios swift core-data cloudkit nspersistentcloudkitcontainer

我正在使用 NSPersistentCloudKitContainer 通过 CloudKit 在不同设备之间同步数据。它适用于新项目,但是当我将它用于旧项目时,使用 NSPersistentContainer 添加的旧数据不会同步。

我想实现的是在将 NSPersistentContainer 更改为 NSPersistentCloudKitContainer 后同步添加的旧数据。可能吗?

最佳答案

我找到了适用于我的 Core Data 数据库的解决方案 - 我的数据库非常复杂,具有多个多对多关系(名为 Somnus 的手术/麻醉日志应用程序)

我首先为我所有的核心数据实体创建了一个名为 sentToCloud 的新属性,并在核心数据模型中默认将其设置为 FALSE

在现有用户的第一次加载时:

  • 为每个实体类型使用谓词 "sentToCloud == FALSE" 获取请求
  • 将每个对象的sentToCloud更改为TRUE,然后保存MOC
  • 这会触发 NSPersistentCloudKitContainer 开始同步

我已按照适用于我的数据库的“优先级”顺序执行此操作,假设 iCloud 同步 session 与修改核心数据的顺序相匹配。在我的测试中,情况似乎是这样:

  • 我首先同步所有子(或最像子的)实体
  • 然后将他们的 parent 等同步到树上
  • 我会同步用户最后与之交互的对象,一旦其他一切就绪,这样关系就完好无损,并且他们不会认为他们的数据在我们等待 NSPersistentCloudKitContainer 重新连接所有关系
  • 我还保留了所有二进制数据(在幕后神奇地变成了 CKAsset),因为它不是我数据库中最重要的部分

我的数据库已成功从 iPad 同步到 iPhone,并且所有关系和二进制数据都显示正确。

现在我只需要一种方法来告诉用户数据何时同步(和/或某种进度),并让他们完全关闭它。

附录

因此,在重置 iCloud 仪表板上的所有数据并删除我的 iPhone 和 iPad 上的应用程序后,我又试了一次。

第二次它只同步了一些数据。它似乎在处理大型同步请求时仍然存在问题(控制台中有很多 .limitExceeded CKErrors)。

令人沮丧的是,目前尚不清楚它是否会中断重试请求 - 我认为不会。我把它放了一夜,仍然没有进一步同步,只有更多 .limitExceeded CKErrors。

也许这就是他们不想同步现有数据的原因?

就我个人而言,我认为这很愚蠢。有时用户会对他们的数据进行批处理,这将涉及在一次操作中更新数千个 Core Data 对象。如果这只是因为 .limitExceeded CKErrors 而卡住,NSPersistentCloudKitContainer 将不是一个很好的同步解决方案。

他们需要一种更好的方法来处理这些错误(将请求分解成更小的请求),以及查看正在发生的事情的能力(并可能向用户呈现一些 UI)。

我真的需要它来工作,因为就目前而言,没有办法使用 CloudKit 同步多对多核心数据关系。

我只是希望他们仍在致力于这个类(class)并对其进行改进。

关于ios - 使用 NSPersistentCloudKitContainer 同步旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56875823/

相关文章:

ios - TextView 显示 Storyboard中的一半内容

ios - MPMoviePlayerController 未停留在 UIView 的范围内

swift - 保存和生成 AVMetadataMachineReadableCodeObject Swift

macos - NSXMLStoreType 或 NSSqliteStoreType

ios - NSFetchedResultsController 字符串最后一个字符的排序描述符

iphone - CLLocationManager 初始化并调用按钮

ios - 更新到 Mountain Lion 后构建失败

ios - Http post请求没有传递参数?

ios - 如何在 JSQMessageView Controller 中添加静态 header

ios - JSON 的模型类和 Swift 中核心数据的相同类