在iOS上有Core Data的一些真正奇怪的行爲。CoreData關係在mergeChangesFromContextDidSaveNotification後爲零
我有一個NSManagedObjectContext
爲我的主線程用於從SQLLite持久存儲讀取數據並將其顯示給用戶。我也有後臺進程管理的NSOperationQueue
。這些後臺進程創建一個NSMangedObjectContext
,從遠程服務器獲取數據,並將該數據保存到本地Core Data存儲。
我已經註冊了NSManagedObjectContextDidSaveNotification
當我收到這些通知我打電話mergeChangesFromContextDidSaveNotification
主線程的NSManagedObjectContext
(合格通知對象作爲參數)。
這都是非常標準的,所有核心數據文檔都建議您處理多線程的方式。
直到最近,我一直在將新對象插入到數據存儲中,而不是修改數據存儲中的對象。這工作得很好。在後臺線程寫入新數據後,發生合併,我向UIController發送通知並重新繪製顯示。顯示屏繪製正確。
最近我做了一個改變,後臺線程既插入又修改對象。但所有其他模式都保持不變。合併後,我的主線程NSManagedObjectContext
中的數據已損壞。如果我試圖查詢對象,我什麼也收不回來。如果我試圖檢查那些我已經提到它們所有關係的對象都是零(不是故障但是零)。我已經檢查過SQLLite數據庫,數據都在那裏。
唯一的解決方案似乎是重置NSManagedObjectContext
,鑑於該應用的架構,這是不可接受的。好吧,最後一點奇怪。如果我的後臺線程只更新屬性(primitves),那麼我不會得到這種奇怪的行爲。但是,如果我自己更新關係,那麼我會得到這些空的獲取請求結果並且沒有關係。
我錯過了什麼?
我剛開始沿着類似的設計開發,看到了一些相同的東西。你能否確認你沒有在後臺線程中無意插入任何UI調用?我相信你知道這可能會導致不良行爲,並且有點不可預測。如果情況並非如此,請顯示關係更新的代碼。 – Jim 2012-02-24 17:09:45