Swift • CloudKit • 各种NSMergePolicy 对象之间有什么区别?
Swift • CloudKit • What is the difference between the various NSMergePolicy Objects?
我已经使用 NSPersistentCloudKitContainer
.
在我的 iOS 应用程序中实现了 CloudKit
在执行此操作时,我遇到了 NSMergePolicy
。
我搜索了不同选项的解释,但是,Apple Developer Documentation
不是很有帮助。
NSErrorMergePolicy
NSMergeByPropertyStoreTrumpMergePolicy
NSMergeByPropertyObjectTrumpMergePolicy
NSOverwriteMergePolicy
NSRollbackMergePolicy
问题:任何人都可以解释一下,这些政策之间的区别是什么(如果可能的话)?我应该在 (NSErrorMergePolicy
) 上使用默认值还是更改它?
当您尝试保存更改时合并策略很重要,但还有其他更改保存在其他地方 - 例如另一个线程,或 CloudKit 导入一些数据。例如,
- 你获取一个对象
- 您对对象进行了更改但尚未保存更改
- 不同的线程更改同一个对象,但更改与您刚刚所做的更改不同
- 您尝试保存更改
Core Data 如何将未保存的更改与持久存储中的新更改结合起来?这取决于您的合并策略。默认情况下,合并策略是 NSErrorMergePolicy
,这意味着您不能因为冲突而保存更改。不过你还有其他选择。
Apple 的描述简短而切中要害,因此举个例子可能有助于理解它们。假设您有一个 Person
实体,属性为 name
、address
、phone
和 birthday
。您获取了一个实例并正在编辑它,而另一个线程保存了与您的编辑冲突的更改。它可能看起来像这样:
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,因此这样想可能更容易。想象一下,它们被命名为 NSMergeByPropertyStoreWinsMergePolicy
和 NSMergeByPropertyObjectWinsMergePolicy
。] 这些值仅在发生冲突更改时才更改。 在上面的 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
其他--NSOverwriteMergePolicy
和NSRollbackMergePolicy
--也意味着一个版本或另一个版本获胜。但是对于这两个,即使不存在冲突,政策也可以进行更改。一个或另一个 完全 获胜。在上面的 table 中, name
和 address
没有冲突的更改,因为只有一个版本更改了原始值,当然还有 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])
和其他一些功能编写您自己的策略。
我已经使用 NSPersistentCloudKitContainer
.
CloudKit
在执行此操作时,我遇到了 NSMergePolicy
。
我搜索了不同选项的解释,但是,Apple Developer Documentation
不是很有帮助。
NSErrorMergePolicy
NSMergeByPropertyStoreTrumpMergePolicy
NSMergeByPropertyObjectTrumpMergePolicy
NSOverwriteMergePolicy
NSRollbackMergePolicy
问题:任何人都可以解释一下,这些政策之间的区别是什么(如果可能的话)?我应该在 (NSErrorMergePolicy
) 上使用默认值还是更改它?
当您尝试保存更改时合并策略很重要,但还有其他更改保存在其他地方 - 例如另一个线程,或 CloudKit 导入一些数据。例如,
- 你获取一个对象
- 您对对象进行了更改但尚未保存更改
- 不同的线程更改同一个对象,但更改与您刚刚所做的更改不同
- 您尝试保存更改
Core Data 如何将未保存的更改与持久存储中的新更改结合起来?这取决于您的合并策略。默认情况下,合并策略是 NSErrorMergePolicy
,这意味着您不能因为冲突而保存更改。不过你还有其他选择。
Apple 的描述简短而切中要害,因此举个例子可能有助于理解它们。假设您有一个 Person
实体,属性为 name
、address
、phone
和 birthday
。您获取了一个实例并正在编辑它,而另一个线程保存了与您的编辑冲突的更改。它可能看起来像这样:
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,因此这样想可能更容易。想象一下,它们被命名为 NSMergeByPropertyStoreWinsMergePolicy
和 NSMergeByPropertyObjectWinsMergePolicy
。] 这些值仅在发生冲突更改时才更改。 在上面的 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 |
其他--NSOverwriteMergePolicy
和NSRollbackMergePolicy
--也意味着一个版本或另一个版本获胜。但是对于这两个,即使不存在冲突,政策也可以进行更改。一个或另一个 完全 获胜。在上面的 table 中, name
和 address
没有冲突的更改,因为只有一个版本更改了原始值,当然还有 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])
和其他一些功能编写您自己的策略。