2012-10-17 60 views
1

我有一個問題,我很有信心,我知道在廣義上它是什麼以及如何修復它,但我不知道,並沒有發現什麼清潔/最佳實踐的方式來實施解決方案是。如何創建/管理多個ManagedObjectContexts?

我的問題:我是從一個文件到我的核心數據模型在後臺線程中使用dispatch_async,其工作時,我做的GUI的東西,也影響模型,然後一鼓作氣,例如除了罰款加載一些數據:

'NSGenericException', reason: '*** Collection ... was mutated while being enumerated.' 

...我以爲是由於兩個線程在同一ManagedObjectContext數據搞亂,因爲我只使用一個的時刻。

所有文章和回答我讀過告訴我,我應該使用單獨的ManagedObjectContext後臺線程,而是如何/在哪裏設置?

目前我創造我PersistentStoreCoordinator和(一個)ManagedObjectContext在我的應用程序代理,以及ManagedObjectContext傳遞給我的(唯一的)查看協調員。它反過來將它傳遞給後臺數據加載任務(這是我的模型類之一的類方法),從而導致該問題。

我應該

  1. 通過PersistentStoreCoordinator到視圖控制器,所以它反過來又可以把它傳遞給後臺任務,從而使後臺任務可以創建自己的本地ManagedObjectContext?
  2. 在App代表創建ManagedObjectContexts池,他們都傳遞到視圖控制器,以便它可以使用一個自己和給別人出後臺任務?
  3. 別的東西完全?
+0

你可以添加一些代碼?特別是生成異常的代碼。當你說你應該仔細管理線程之間的NSManagedObjectContext對象時,你是對的,但是看到你的代碼真的很好。 – magma

+0

我還沒有設法重複創建完全相同的例外,我引用的例子就是一個例子。但是每當我遇到問題時,總是在GUI中做某件事情時會改變ManagedObjectContext中的某些內容,而後臺任務正在將數據加載並保存在相同的上下文中。 – AlanL

回答

0

我還一直沒能始終如一地重現該問題;它似乎高度依賴於時間。但這是我所做的努力來阻止它。

在視圖控制器:

- (void) loadNewStuff: (NSString *)stuffID 
{ 
    dispatch_async(taskQueue, 
     ^(void){[MyModelClass loadNewStuff: stuffID withContext: myContext];} 
    ); 
} 

在模型類:

+ (void) loadNewStuff: (NSString *)stuffID withContext: (NSManagedObjectContext *)passedContext 
{ 
    NSManagedObjectContext *localContext = [[NSManagedObjectContext alloc] init]; 
    [localContext setPersistentStoreCoordinator: passedContext.persistentStoreCoordinator]; 

    // load new stuff, save local context, finished 

} 

...這是正確的,還是我忽視了是要咬我可怕的東西嗎?

(我使用ARC,所以我想沒有明確釋放本地創建上下文好嗎?)