Soh*_*ohn 6 merge core-data ios swift
我读了关于NSMergeByPropertyStoreTrumpMergePolicy的核心数据合并策略的apple developer文档.
https://developer.apple.com/documentation/coredata/nsmergebypropertystoretrumpmergepolicy
在文件中,
一种策略,它将持久存储的对象版本与当前内存中版本之间的冲突按个别属性合并,内存中的更改优先于外部更改.
合并由个人财产发生.对于在外部源和内存中都已更改的属性,外部更改优先于内存中的更改.
我无法理解什么是"个人财产","记忆中的变化胜过外部变化"和"外部变化胜过记忆中的变化"的意思.
我认为"内存中的变化"是当前保存的背景.并且'外部变化'是之前由其他上下文改变的持久存储.这样对吗?
谢谢你的帮助.
当您设置合并策略时,您要求核心数据丢失您保存的数据 - 唯一的问题是什么数据.理想情况下,您希望避免核心数据中的任何写入冲突.当您有更多的上下文同时写入商店时,可能会发生写冲突.您应该创建一个操作队列,以确保不会发生冲突.(请参阅NSPersistentContainer并发以保存到核心数据).
回答你的问题:内存是指你刚刚调用的上下文中的更改save."外部变化"是指那一刻商店里发生的事情.这些外部变化通常只是另一个从不同线程同时写入的上下文.
要理解它们之间的区别OverwriteMergePolicy,MergeByPropertyObjectTrump您必须知道上下文知道哪些属性已更改为以及哪些属性已更改.如果商店的属性from值不是上下文的值,则会发生冲突.有些情况下,值在上下文中没有变化,但仍然与商店具有不同的值.在覆盖策略中,这些值也会更改,在"属性"策略中,只有上下文更改的属性才会更改.
所以如果商店有一个对象:
property 1: A
property 2: A
property 3: A
Run Code Online (Sandbox Code Playgroud)
在记忆中有:
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
Run Code Online (Sandbox Code Playgroud)
对于覆盖策略,对象将保存为当前在商店的上下文中,甚至是未被上下文编辑的属性3
property 1: B
property 2: C
property 3: B
Run Code Online (Sandbox Code Playgroud)
对于by属性策略,该对象仅强制更改其更改的属性.所以属性3将保持为A,因为它不是由上下文编辑的,属性2将会改变,即使它看到的from值与预期不同:
property 1: B
property 2: C
property 3: A
Run Code Online (Sandbox Code Playgroud)
再说一次,正如我上面所说,你真的应该尽量避免合并冲突而根本不使用合并策略.
| 归档时间: |
|
| 查看次数: |
1727 次 |
| 最近记录: |