chr*_*epe 6 xcode core-data ios swift cloudkit
我已经CloudKit使用NSPersistentCloudKitContainer.
在执行此操作时,我遇到了NSMergePolicy.
我搜索了不同选项的解释,但是Apple Developer Documentation没有太大帮助。
NSErrorMergePolicyNSMergeByPropertyStoreTrumpMergePolicyNSMergeByPropertyObjectTrumpMergePolicyNSOverwriteMergePolicyNSRollbackMergePolicy问题:谁能解释一下,这些政策之间的区别是什么(如果可能的话,举例说明)?我应该使用( NSErrorMergePolicy)上的默认值还是更改它?
Tom*_*ton 31
当您尝试保存更改但还有其他更改保存在其他地方(例如另一个线程或导入某些数据的 CloudKit)时,合并策略很重要。例如,
Core Data 如何将未保存的更改与持久存储中的新更改结合起来?这取决于您的合并策略。默认情况下,合并策略为NSErrorMergePolicy,这意味着由于冲突而无法保存更改。不过,你还有其他选择。
Apple 的描述简短而切中要点,因此一个示例可能有助于理解它们。假设您有一个Person实体,其属性为name、address、phone和birthday。您获取了一个实例并对其进行编辑,而另一个线程保存了与您的编辑冲突的更改。它可能看起来像这样:
| 财产 | 原来的 | 你的改变 | 其他线程变化 |
|---|---|---|---|
name |
泰勒斯威夫特 | 泰勒·琼斯 | 泰勒斯威夫特 |
address |
主街123号 | 主街123号 | 芝麻街123号 |
phone |
(212) 555-1212 | 1-800-275-2273 | (650) 253-0000 |
birthday |
电子乐 | 电子乐 | 电子乐 |
现在您尝试保存更改,那么会发生什么?核心数据如何解决您的更改与其他线程的更改?内置的合并策略提供了一些选项。
其中两个“按属性”合并,这意味着 Core Data 查看每个属性值并选择一个值或另一个值。NSMergeByPropertyStoreTrumpMergePolicy意味着当值不同时,持久存储中的值获胜。NSMergeByPropertyObjectTrumpMergePolicy意味着内存中的值获胜。[在这些政策名称中,“特朗普”意味着超越或获胜,因此这样考虑可能更容易。想象一下它们被命名为NSMergeByPropertyStoreWinsMergePolicy和NSMergeByPropertyObjectWinsMergePolicy。]这些仅在存在冲突的更改时才会更改值。在上表中,这种情况发生在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])
| 归档时间: |
|
| 查看次数: |
1196 次 |
| 最近记录: |