iOS核心数据合并策略 - NSMergeByPropertyStoreTrumpMergePolicy

问题描述 投票:4回答:1

我读了关于NSMergeByPropertyStoreTrumpMergePolicy的核心数据合并策略的apple developer文档。

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

在文件中,

一种策略,它将持久存储的对象版本与当前内存中版本之间的冲突按个别属性合并,内存中的更改优先于外部更改。

合并由个人财产发生。对于在外部源和内存中都已更改的属性,外部更改优先于内存中的更改。

我无法理解什么是“个人财产”,“记忆中的变化胜过外部变化”和“外部变化胜过记忆中的变化”的意思。

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

谢谢你的帮助。

ios swift core-data merge
1个回答
7
投票

当您设置合并策略时,您要求核心数据丢失您保存的数据 - 唯一的问题是什么数据。理想情况下,您希望避免核心数据中的任何写入冲突。当您有多个上下文同时写入商店时,可能会发生写冲突。您应该创建一个操作队列,以确保不会发生冲突。 (见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

对于by属性策略,该对象仅强制更改其更改的属性。所以属性3将保持为A,因为它不是由上下文编辑的,属性2将会改变,即使它看到的from值与预期不同:

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

再说一次,正如我上面所说,你真的应该尽量避免合并冲突而根本不使用合并策略。

© www.soinside.com 2019 - 2024. All rights reserved.