【问题标题】:Detect and handle certain conflicts in Core Data with iCloud Sync使用 iCloud 同步检测和处理 Core Data 中的某些冲突
【发布时间】:2022-09-28 14:17:16
【问题描述】:

我正在尝试创建一个使用 NSPersistentCloudKitContainer 和核心数据的类似笔记的应用程序。

该商店使用 NSMergeByPropertyObjectTrumpMergePolicy,这几乎适用于所有属性。例如,如果在两个不同的设备上更改了文件的名称,则可以使用最新的值。

问题是,如果同时在两个设备上更改注释文本,则不能被最新值覆盖。它需要被检测为冲突,以便用户可以选择他们想要保留的版本。

我可以通过在一台设备上关闭 wifi 并写入内容来复制该行为,然后同时在另一台设备上写入内容。当我重新打开 wifi 时,最后保存更改的设备会完全覆盖其他设备的文本。

我想要完成的是检测何时存在文本冲突,然后创建一个名为“冲突副本”的重复文件。如果有人能告诉我 Apple Notes 如何神奇地合并文本而不会产生冲突,那就加分。我真的只需要一个简单的解决方案,尽管它可以防止数据丢失。

任何正确方向的帮助将不胜感激!

  • 如果还是卡住。还没有尝试这个。但我认为需要的是自定义NSMergePolicy 并将其分配给viewContext(或其他moc 实例,如果使用)。使用域特定策略在子字符串级别触发用户解析或属性合并,结合两组更改以解决所有冲突(没有内部信息,但我猜这是 Apple 所做的)。
  • 找不到特别接近的东西,但这看起来很有趣medium.com/@deeps_ramesh/custom-merge-policy-7badcc2f8b11

标签: swift xcode core-data icloud


【解决方案1】:

当 CoreData 和 CloudKit 将对象同步到持久存储,而托管上下文具有尚未保存的对象的更新版本时,就会出现冲突。
任何合并策略(包括自定义合并策略)都用于创建将存储在持久存储中的单个对象,但您希望同时拥有两个冲突的对象,以便用户可以选择其中一个。
因此,不能应用自动冲突解决,包括使用自定义合并策略。
而是使用error 类型的默认合并策略。 docs

如果由于对象冲突而导致保存失败,您可以找到 ID 错误的 userInfo 字典中的那些对象。使用 NSInsertedObjectsKey 和 NSUpdatedObjectsKey 键来提取 对象 ID。

这意味着,您可以将尚未存储的冲突对象的属性保留在托管上下文中,并从持久存储中重新获取冲突对象的属性。这将覆盖冲突的上下文版本并“解决”冲突,但您现在仍然拥有冲突的属性并可以将它们呈现给用户。
如果用户选择持久存储中的版本,您就完成了。否则,根据需要使用保留的值更新对象属性并保存上下文。
PS:Here 供您参考如何实现自定义合并策略,虽然这里不能应用,因为这样的信息很难找到。

【讨论】:

    猜你喜欢
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    相关资源
    最近更新 更多