Swift • CloudKit • 各种NSMergePolicy 对象之间有什么区别?

chr*_*epe 6 xcode core-data ios swift cloudkit

我已经CloudKit使用NSPersistentCloudKitContainer.

在执行此操作时,我遇到了NSMergePolicy.

我搜索了不同选项的解释,但是Apple Developer Documentation没有太大帮助。

  • NSErrorMergePolicy
  • NSMergeByPropertyStoreTrumpMergePolicy
  • NSMergeByPropertyObjectTrumpMergePolicy
  • NSOverwriteMergePolicy
  • NSRollbackMergePolicy

问题:谁能解释一下,这些政策之间的区别是什么(如果可能的话,举例说明)?我应该使用( NSErrorMergePolicy)上的默认值还是更改它?

Tom*_*ton 31

当您尝试保存更改但还有其他更改保存在其他地方(例如另一个线程或导入某些数据的 CloudKit)时,合并策略很重要。例如,

  • 你获取一个对象
  • 您对对象进行了更改,但尚未保存更改
  • 不同的线程更改同一个对象,其更改与您刚刚所做的更改不同
  • 您尝试保存更改

Core Data 如何将未保存的更改与持久存储中的新更改结合起来?这取决于您的合并策略。默认情况下,合并策略为NSErrorMergePolicy,这意味着由于冲突而无法保存更改。不过,你还有其他选择。

Apple 的描述简短而切中要点,因此一个示例可能有助于理解它们。假设您有一个Person实体,其属性为nameaddressphonebirthday。您获取了一个实例并对其进行编辑,而另一个线程保存了与您的编辑冲突的更改。它可能看起来像这样:

财产 原来的 你的改变 其他线程变化
name 泰勒斯威夫特 泰勒·琼斯 泰勒斯威夫特
address 主街123号 主街123号 芝麻街123号
phone (212) 555-1212 1-800-275-2273 (650) 253-0000
birthday 电子乐 电子乐 电子乐

现在您尝试保存更改,那么会发生什么?核心数据如何解决您的更改与其他线程的更改?内置的合并策略提供了一些选项。

其中两个“按属性”合并,这意味着 Core Data 查看每个属性值并选择一个值或另一个值。NSMergeByPropertyStoreTrumpMergePolicy意味着当值不同时,持久存储中的值获胜。NSMergeByPropertyObjectTrumpMergePolicy意味着内存中的值获胜。[在这些政策名称中,“特朗普”意味着超越或获胜,因此这样考虑可能更容易。想象一下它们被命名为NSMergeByPropertyStoreWinsMergePolicyNSMergeByPropertyObjectWinsMergePolicy。]这些仅在存在冲突的更改时才会更改值。在上表中,这种情况发生在phone.

使用这些政策进行储蓄时会发生以下情况:

使用 时NSMergeByPropertyStoreTrumpMergePolicy,当发生冲突时,持久存储会获胜。

财产 解析值 解释
name 泰勒·琼斯 没有冲突,您的更改已被使用
address 芝麻街123号 不冲突,使用存储更改
phone (650) 253-0000 冲突!合并政策表明商店获胜
birthday 电子乐 没有变化

使用NSMergeByPropertyObjectTrumpMergePolicy,内存中的更改赢得了冲突:

财产 解析值 解释
name 泰勒·琼斯 没有冲突,您的更改已被使用
address 芝麻街123号 不冲突,使用存储更改
phone 1-800-275-2273 冲突!合并政策表明您的更改获胜
birthday 电子乐 没有变化

其他NSOverwriteMergePolicy- 和NSRollbackMergePolicy- 也意味着一个版本或另一个版本获胜。但对于这两者,即使不存在冲突,政策也可以做出改变。两者必胜无疑name在上表中,和存在非冲突的更改,address因为只有一个版本更改了原始值,当然,再次存在冲突的更改phone

这些合并策略会发生以下情况:

使用NSOverwriteMergePolicy,即使没有冲突的更改,您的内存中更改也会在所有地方获胜。

财产 解析值 解释
name 泰勒·琼斯 没有冲突,您的更改已被使用
address 主街123号 没有冲突,但合并策略表明您的更改获胜
phone 1-800-275-2273 冲突!合并政策表明您的更改获胜
birthday 电子乐 没有变化

情况NSRollbackMergePolicy恰恰相反:持久存储在任何地方都会获胜,即使没有发生冲突的更改。

财产 解析值 解释
name 泰勒斯威夫特 没有冲突,但合并政策表明商店获胜
address 芝麻街123号 不冲突,使用持久存储值
phone (650) 253-0000 冲突!合并策略表明持久存储获胜
birthday 电子乐 没有变化

如果这些都不能满足您的要求,您可以通过实现或其他一些功能来子类化NSMergePolicy并编写自己的策略。resolve(mergeConflicts: [Any])