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

Swift • CloudKit • What is the difference between the various NSMergePolicy Objects?

我已经使用 NSPersistentCloudKitContainer.

在我的 iOS 应用程序中实现了 CloudKit

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

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

问题:任何人都可以解释一下,这些政策之间的区别是什么(如果可能的话)?我应该在 (NSErrorMergePolicy) 上使用默认值还是更改它?

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

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

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

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

Property Original Your change Other thread change
name Taylor Swift Taylor Jones Taylor Swift
address 123 Main St 123 Main St 123 Sesame St
phone (212) 555-1212 1-800-275-2273 (650) 253-0000
birthday Electronica Electronica Electronica

现在您尝试保存更改,结果如何? Core Data 如何解决您的更改与其他线程的更改?内置的合并策略提供了一些选项。

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

这是使用这些策略保存时发生的情况:

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

Property Resolved value Explanation
name Taylor Jones No conflict, your change is used
address 123 Sesame St No conflict, store change is used
phone (650) 253-0000 Conflict! Merge policy says the store wins
birthday Electronica No changes

对于 NSMergeByPropertyObjectTrumpMergePolicy,内存中的更改赢得了冲突:

Property Resolved value Explanation
name Taylor Jones No conflict, your change is used
address 123 Sesame St No conflict, store change is used
phone 1-800-275-2273 Conflict! Merge policy says the your change wins
birthday Electronica No changes

其他--NSOverwriteMergePolicyNSRollbackMergePolicy--也意味着一个版本或另一个版本获胜。但是对于这两个,即使不存在冲突,政策也可以进行更改。一个或另一个 完全 获胜。在上面的 table 中, nameaddress 没有冲突的更改,因为只有一个版本更改了原始值,当然还有 phone 的冲突更改.

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

使用 NSOverwriteMergePolicy,即使没有冲突的更改,内存中的更改也会在任何地方胜出。

Property Resolved value Explanation
name Taylor Jones No conflict, your change is used
address 123 Main St No conflict, but merge policy says your change wins
phone 1-800-275-2273 Conflict! Merge policy says your change wins
birthday Electronica No changes

NSRollbackMergePolicy 情况恰恰相反:持久存储无处不在,即使没有冲突的变化。

Property Resolved value Explanation
name Taylor Swift No conflict but merge policy says the store wins
address 123 Sesame St No conflict, persistent store value is used
phone (650) 253-0000 Conflict! Merge policy says the persistent store wins
birthday Electronica No changes

如果其中 none 符合您的要求,您可以子类化 NSMergePolicy 并通过实施 resolve(mergeConflicts: [Any]) 和其他一些功能编写您自己的策略。