【问题标题】:iOS Core Data Merge Policy - NSMergeByPropertyStoreTrumpMergePolicyiOS 核心数据合并策略 - NSMergeByPropertyStoreTrumpMergePolicy
【发布时间】:2017-10-18 09:06:10
【问题描述】:

我阅读了关于 NSMergeByPropertyStoreTrumpMergePolicy 的核心数据合并策略的苹果开发者文档。

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

在文档中,

一种策略,通过单个属性合并持久存储的对象版本和当前内存版本之间的冲突,内存中的更改胜过外部更改。

合并由单个属性发生。对于在外部源和内存中都已更改的属性,外部更改胜过内存中的更改。

我无法理解“个体属性”、“内存中的变化胜过外部的变化”和“外部的变化胜过内存中的变化”是什么意思。

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

感谢您的帮助。

【问题讨论】:

    标签: ios swift core-data merge


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回答。在答案中,我不明白为什么在内存上下文中有 A、B、B 而不是 A、A、A。
    • 上下文可以有 ABB,因为这是创建上下文时的存储状态。与此同时,另一个上下文将其更改为 AAA。所以现在当第一个上下文尝试保存它时,它发现它来自值不匹配。对于最终状态,BCB 或 BCA 都没有真正意义。 BCB 意外撤消了第二个上下文所做的更改。 BCB 创建一个没有上下文要求的状态。如果该属性是基于另一个属性(例如名称和本地化排序顺序名称)的派生属性,它很容易得到消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 2011-06-20
    相关资源
    最近更新 更多