2012-02-24 56 views
3

在iOS上有Core Data的一些真正奇怪的行爲。CoreData關係在mergeChangesFromContextDidSaveNotification後爲零

我有一個NSManagedObjectContext爲我的主線程用於從SQLLite持久存儲讀取數據並將其顯示給用戶。我也有後臺進程管理的NSOperationQueue。這些後臺進程創建一個NSMangedObjectContext,從遠程服務器獲取數據,並將該數據保存到本地Core Data存儲。

我已經註冊了NSManagedObjectContextDidSaveNotification當我收到這些通知我打電話mergeChangesFromContextDidSaveNotification主線程的NSManagedObjectContext(合格通知對象作爲參數)。

這都是非常標準的,所有核心數據文檔都建議您處理多線程的方式。

直到最近,我一直在將新對象插入到數據存儲中,而不是修改數據存儲中的對象。這工作得很好。在後臺線程寫入新數據後,發生合併,我向UIController發送通知並重新繪製顯示。顯示屏繪製正確。

最近我做了一個改變,後臺線程既插入又修改對象。但所有其他模式都保持不變。合併後,我的主線程NSManagedObjectContext中的數據已損壞。如果我試圖查詢對象,我什麼也收不回來。如果我試圖檢查那些我已經提到它們所有關係的對象都是零(不是故障但是零)。我已經檢查過SQLLite數據庫,數據都在那裏。

唯一的解決方案似乎是重置NSManagedObjectContext,鑑於該應用的架構,這是不可接受的。好吧,最後一點奇怪。如果我的後臺線程只更新屬性(primitves),那麼我不會得到這種奇怪的行爲。但是,如果我自己更新關係,那麼我會得到這些空的獲取請求結果並且沒有關係。

我錯過了什麼?

+0

我剛開始沿着類似的設計開發,看到了一些相同的東西。你能否確認你沒有在後臺線程中無意插入任何UI調用?我相信你知道這可能會導致不良行爲,並且有點不可預測。如果情況並非如此,請顯示關係更新的代碼。 – Jim 2012-02-24 17:09:45

回答

3

好的,我想出了我的問題。 我的問題是mergeChangesFromContextDidSaveNotification合併從一個線程到另一個線程的變化的方式。正如我多次閱讀過的,它不會播放您所做的更改,而是將最終狀態合併在一起。我沒有意識到這一點的後果。在我的後臺線程中,我刪除了一個對象,但在刪除它之前,我清除了它的一些關係,因爲它們被標記爲級聯刪除,我不希望它們被刪除。 顯然,當我將這些已刪除的對象合併到主要上下文中時,核心數據仍然執行刪除規則,級聯刪除主要上下文中的相關對象。 我改變了我的刪除規則,現在我的關係沒有被錯誤地刪除。不幸的是,我有一種關係,在某些情況下,我想要級聯刪除,而在其他情況下,我不這樣做。我將不得不爲此努力。

+0

那麼究竟是什麼修復? – 2012-08-03 09:04:26