2012-07-30 70 views
0

我在使用NSOperations的多線程應用程序中遇到了一些與CoreData一起工作的麻煩。我通過MagicalRecord(2.0.3)如下使用嵌套ManagedObjectContexts:當使用NSOperations時兄弟NSManagedObjectContexts

Root Context (saves to disk) 
| 
Main Thread Context (for populating the UI) 
| 
Sub-Context(s) (used to add/edit/remove data) 

我有一個單一的NSOperationQueue來處理所有的數據處理。

大部分情況下,我可以異步下載數據,然後將其提供給NSOperation,然後將其寫入其中一個子上下文。在操作結束時保存將更改推送到主要上下文和UI更新。大!

問題是,如果一個子上下文刪除一個實體並保存(推送到主上下文),則兄弟子上下文仍然會認爲它存在。那麼,如果一個兄弟會試圖讓實體發生故障並將其從它的父母(主環境)中拉出來,我就會崩潰。

我有2個問題:

  • 我應該使用MOC通知合併更改推到主MOC回到它的其他孩子?我這個,並得到另一個崩潰...
  • 我應該甚至有mutltiple子上下文? MOC應該與單個線程相關聯(MagicalRecord有助於自動執行此操作),並且我有一個用於保存數據的NSOperationQueue,所以我不應該只有1個子上下文嗎?我已經驗證過,有時我的保存是由不同的上下文執行的。

我會很感激任何意見。謝謝。

回答

1

您可以並應該有多個子上下文。但是,我不確定上下文的經典「線程隔離模式」是否是您應該擁有的模型。當你說某個上下文應該屬於某個特定的線程時,你就是這麼做的。 MagicalRecord 2.0x現在使用私有隊列上下文,因此會有不同的表現。沒有規則說兄弟情況需要保持同步。你必須自己做。一個非常簡單的解決方案是聽取你保存的上下文的「保存」通知,並且重置或者在另一個線程上創建一個新的上下文。您可以使用通知或MagicalRecord提供的完成黑色來執行此操作。

希望這會有所幫助

+0

我也在尋找重置,但很謹慎。我會試試看它是如何執行和回發的。謝謝! – brianpartridge 2012-07-30 19:15:41

+0

終於嘗試了它,調用'重置'修復了這個問題。 – brianpartridge 2012-08-01 00:46:02