2017-10-18 106 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)的派生屬性,則可以輕鬆地獲取消息。 –