2013-10-28 94 views
4

在我的iOS應用程序中,我試圖將核心數據與Web後端同步。我想爲同步使用單獨的後臺託管對象上下文,以便在同步正在處理時,可以使我的主要上下文自由地接受來自ui的更改。這兩個上下文都是我的寫入磁盤上下文的子項,根據此博文http://www.cocoanetics.com/2012/07/multi-context-coredata/合併多個子項管理的對象上下文

我的問題是,如何在保存到磁盤之前合併兩個子上下文?

如果我訂閱contextDidSaveNotifications,我可以用

[mainContext mergeChangesFromContextDidSaveNotification:syncFinishedNotification]; 

,但根據文檔合併的背景下... 「這個方法刷新其已在其他情況下被更新的對象,故障任何新插入的對象,並在已被刪除的對象上調用deleteObject ::「。

我不想刷新更新的對象並丟失對mainContext所做的更改,而是合併這兩個更改集。

我是新來的多上下文核心數據,所以我可能會想到這個錯誤的方式。

任何想法?

回答

2

合併核心數據中的更改始終是在一個託管對象上下文中進行更改並將其應用於另一個上下文的過程。如果兩個上下文可能同時獲取新更改,則合併會受上下文合併策略的影響。如果沒有衝突更改,沒有什麼可擔心的。但是,如果有可能,您需要選擇適當的合併策略。

如果您什麼都不做,則默認值爲NSErrorMergePolicyType,這意味着合併更改後保存更改將失敗。你幾乎肯定不會那樣做。但還有其他預定義政策可供選擇。 NSMergeByPropertyObjectTrumpMergePolicyType往往是一個很好的選擇,因爲優先考慮未保存的衝突變化。因此,如果同步上下文對用戶正在編輯的對象進行衝突更改,則會保留用戶的更改。還有其他一些罐頭選項。如果他們都不合適,你總是可以繼承NSMergePolicy並做任何你喜歡的事情。但這很少有必要。

+0

謝謝,這正是我所尋找的。看了一會兒之後,似乎我甚至不需要使用mergeChangesFromContextDidSaveNotification。如果我保存子上下文,所有更改將使用我指定的NSMergePolicy合併到父項中。這是一個正確的理解? – adamF

+0

@adamF雖然沒有任何理由/記錄,但在經過堆棧溢出的討論之後,我也覺得你的理解是正確的。 「甚至不需要使用mergeChangesFromContextDidSaveNotification。如果我保存了子上下文,所有的更改都將使用NSMergePolicy合併到父項中,我指定了」你確認我們的假設是否正確? – Dinakar

相關問題