0

合併到多個線程這更多的是爲什麼這個工作,也不至於那種問題......的NSManagedObjectContext保存/通過notifcation中心問題

我使用CoreData在多個線程。我正在催生關閉主線程的兩個線程,他們都進行了類似的電話:

id observerObject = [notificationCenter addObserverForName:NSManagedObjectContextDidSaveNotification 
                 object:secondManagedObjectContext 
                 queue:nil 
                usingBlock:^(NSNotification *saveNotification) { 
                 dispatch_async(dispatch_get_main_queue(), ^{ 
                  [mainThreadManagedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification]; 
                 }); 
                }]; 
    [secondManagedObjectContext save:nil]; 


    [notificationCenter removeObserver:observerObject 
            name:NSManagedObjectContextDidSaveNotification 
           object:syncManagedObjectContext]; 

這似乎很好地工作,但以前我與通知中心這樣做的,有一些問題:

id observerObject = [notificationCenter addObserverForName:NSManagedObjectContextDidSaveNotification 
                 object:secondManagedObjectContext 
                 queue:[NSOperationQueue mainQueue] 
                usingBlock:^(NSNotification *saveNotification) { 
                 [mainThreadManagedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification]; 
                }]; 

這有時會起作用,但有時XCode會在啓動時暫停並在呼叫中放下一個綠色斷點,並列出線程及其編號,但不會出現錯誤。 (注意:如果我產生兩個或更多線程,則只會出現此問題)。

罪魁禍首似乎是:[NSOperationQueue mainQueue],但我似乎無法弄清楚爲什麼它會使線程暫停。我能夠繼續在調試器中繼續前進......但我不明白爲什麼它以這種方式運行。

我認爲我做錯了什麼,我擔心我的新方法可能只是一個破解。

感謝您的幫助!

回答

1

我覺得第一個作品是因爲異步調度。沒有這一點,通知中心將暫停,直到任何特定的通知完成。你得到的問題聽起來像是一個典型的代碼停頓,代碼只是暫停而沒有錯誤,直到最終調試器超時。

0

不確定這是否有幫助,但是您的隊列爲零的位置嘗試使用通用隊列。看看蘋果文檔中的接待員設計模式。

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
0

您的第一個代碼示例中的合併被正確地分派到主線程上,這最可能也是moc創建的線程。

在第二個示例中,如果在bg線程上發出通知(通知回調始終在發佈通知的同一線程上調用該通知),將在後臺線程上執行合併。

順便說一句,不是使用主隊列,我現在寧願使用NSManagedObjectContext自己的performBlock:方法(> = iOS 5)。在使用ARC的iOS5上,此代碼歸結爲:

__weak typeof(self) weakSelf = self; 
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:nil queue:nil usingBlock:^(NSNotification *note) { 
    [weakSelf.moc performBlock:^{ 
     [weakSelf.moc mergeChangesFromContextDidSaveNotification:note]; 
    }]; 
}]; 
相關問題