2012-10-13 155 views
5

我在多線程中使用單個MOC帶來了所有後果 - 我的應用程序隨機崩潰,因爲MOC是在主線程中創建的,我也用它來填充數據庫另一個線程。 雖然代碼是使用全局單例式同步(@synchronize),但應用程序崩潰。 我讀過爲每個線程使用單獨的MOC會使事情順利,但我也讀到它也被認爲是跨線程共享NSManagedObjects的一種不好的方法。核心數據 - 在多個線程之間共享NSManagedObjects

我的用例如下: 1)我從服務器加載和解析XML,並在解析過程中將每個新的NSManagedObject插入到數據庫中。這一切都發生在一個單獨的線程中。 2)從主線程用戶與從數據庫讀取數據的用戶界面進行交互。

在這兩個線程我使用NSManagedObjects。你會如何建議我解決這個問題?我已經多次失敗了。

大多數情況下,應用程序會出現錯誤,提示我在修改集合的同時枚舉它,因爲代碼是同步的,當我迭代它時,不會發生修改,反之亦然 - 當我修改它時, t迭代,我完成後保存。

回答

8

每個線程使用一個NSManagedObjectContext。如果您在線程之間通信,請傳遞線程安全的NSManagedObjectID,然後再從您的線程上下文中獲取對象。在我的應用程序中,有時甚至使用每個控制器的一個上下文

要管理不同的上下文,請爲NSManagedObjectContextDidChangeNotification註冊一個Observer。在此通知處理中,您可以通過mergeChangesFromContextDidSaveNotification:方法將通知傳遞給每個上下文。此方法是線程保存並使上下文更新其狀態。

之後,你必須刷新你的意見。如果您有基於表格視圖的應用程序,請查看NSFetchedResultsController。這有助於您使用適當的動畫自動更新表格。如果你不使用表視圖,你必須自己實現UI更新。

5

如果您只支持iOS 5及更高版本,則無需處理NSManagedObjectID併合並上下文。您可以改用NSManagedObjectContext的新併發類型。然後在managedObjectContext:performBlock內進行操作,它們將自動合併。

請參閱從svena答案這裏瞭解更多信息: Core Data and Concurrency using NSOperationQueues