NSMergePolicyType 的文档是错误的,还是我误解了描述?

rya*_*ete 7 core-data ios swift

具体来说,我想知道.mergeByPropertyObjectTrumpMergePolicyType和的定义是否.mergeByPropertyStoreTrumpMergePolicyType交换。

来自Apple(强调我的):

mergeByPropertyObjectTrumpMergePolicyType:合并冲突的策略...通过单个属性,外部更改胜过内存更改

我的实验:

在一个新的 iOS 项目中:

  1. 我创建了两个共享持久存储协调器的上下文 -mainbackground. 每个上下文的合并策略设置为.mergeByPropertyObjectTrumpMergePolicyType(与上面的描述相同)。
  2. 在该模型中,我定义一个Document实体W / Aname型的属性String/ NSString
  3. 我创建并保存一个实例,documentADocument
  4. main上下文中,我获取documentA并将其设置name为“main_document”。我不保存。
  5. background上下文中,我获取documentA并将其设置name为“background_document”。
  6. 我保存background上下文。
  7. documentA.name正如预期的那样,数据库的版本(使用外部 sqlite 客户端获取)现在是“background_document”。
  8. 我保存main上下文。

这是我遇到意外行为的地方,至少根据我对文档的阅读 - 数据库的版本documentA.name现在是“main_document”。

如果外部更改应该胜过内存更改,那么数据库的值不应该仍然设置为“background_document”吗?

编辑:如果我将每个上下文的合并策略切换到.mergeByPropertyStoreTrumpMergePolicyType,我会从.mergeByPropertyObjectTrumpMergePolicyType的描述中得到我期望的行为- 保存main上下文会丢弃main的更改。

小智 0

是的你是对的。

它们在框架标头中是正确的。

// This singleton policy merges conflicts between the persistent store's version of the object and the current in memory version. The merge occurs by individual property. For properties which have been changed in both the external source and in memory, the external changes trump the in memory ones.
@available(iOS 3.0, *)
public var NSMergeByPropertyStoreTrumpMergePolicy: AnyObject

// This singleton policy merges conflicts between the persistent store's version of the object and the current in memory version. The merge occurs by individual property. For properties which have been changed in both the external source and in memory, the in memory changes trump the external ones.
@available(iOS 3.0, *)
public var NSMergeByPropertyObjectTrumpMergePolicy: AnyObject
Run Code Online (Sandbox Code Playgroud)