2017-10-18 74 views
1

我阅读了有关NSMergeByPropertyStoreTrumpMergePolicy核心数据合并策略的Apple开发人员文档。iOS核心数据合并策略 - NSMergeByPropertyStoreTrumpMergePolicy

https://developer.apple.com/documentation/coredata/nsmergebypropertystoretrumpmergepolicy

在文档中,

是融合持久性存储的版本对象和当前内存版本由个人财产之间的冲突,在内存中的一个策略改变战胜了外部变化。

合并发生的个人财产。对于外部源和内存中已更改的属性,外部更改胜过内存中的内容。

我不明白什么是'个人财产','内存中的变化引发外部的变化','外部的变化胜过内存中的'意味着什么。

我认为“内存中的变化”是当前要保存的上下文。而“外部变更”是之前由其他上下文更改的持久性存储。这样对吗?

感谢您的帮助。

回答

1

设置合并策略时,您要求核心数据丢失保存的数据 - 唯一的问题是数据是什么。理想情况下,您希望避免核心数据发生任何写入冲突。写入冲突可能会在您同时向商店写入更多上下文时发生。您应该创建一个操作队列以确保您不会发生冲突。 (见NSPersistentContainer concurrency for saving to core data)。

要回答你的问题:内存中的内容意味着你刚刚调用save的上下文中的更改。 “外部变化”意味着当时商店正在发生什么。这些外部变化通常是另一个同时从另一个线程写入的上下文。

要了解OverwriteMergePolicyMergeByPropertyObjectTrump之间的区别,您必须知道上下文知道哪些属性已更改为以及哪些属性已更改。当商店的值不是上下文所具有的from值时,这是一个冲突。有些情况下,价值在上下文中没有变化,但仍然与商店有不同的价值。在覆盖策略中,这些值也被更改,在属性策略中,只有上下文更改后改变的属性。

所以,如果店里有一个对象:

property 1: A 
property 2: A 
property 3: A 

,并在内存有:

property 1: A -> B // no conflict - regular change 
property 2: B -> C // "by property" conflict - store has wrong *from* value 
property 3: B  // conflict but not changed by the context 

对于覆盖的政策对象将被保存,因为它目前是在上下文商店,甚至属性3没有被编辑的上下文

property 1: B 
property 2: C 
property 3: B 

对于按属性政策的对象t只会强制改变它所改变的属性。所以属性3将保持为A,因为它没有被上下文编辑,并且属性2将会改变,即使它看到不同于预期的from值。:

property 1: B 
property 2: C 
property 3: A 

同样,正如我上面所说的,您应该尽量避免合并冲突,并且完全不使用合并策略。

+0

感谢您的回答。在答案中,我不明白为什么在内存环境中有A,B,B不是A,A,A。 – Sohn

+0

上下文可以有ABB,因为这是上下文创建时的存储状态。同时,另一个上下文将其更改为AAA。所以,现在当第一个上下文试图保存时,就会发现它的值不匹配。 BCB或BCA对于最终状态都没有意义。 BCB意外地撤销了第二个上下文所做的更改。 BCB创建一个没有上下文要求的状态。如果该属性是基于另一个属性(类似name和localizedSortOrderName)的派生属性,则可以轻松地获取消息。 –