2012-07-29 78 views
1

在iOS5中,我有一個的NSManagedObjectContext我與一個NSPrivateQueueConcurrencyType創建,就像這樣:的NSManagedObjectContext私人併發類型在主線程上執行塊

self.moc = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] autorelease]; 
moc.parentContext = rootContext; 

此執行主線程上,但如果我理解文檔正確的這應該不重要,因爲交通部有自己的隊列,對吧?

現在,在某些時候我執行讀取請求時,像這樣:

[self.moc performBlockAndWait:^() { // (1) 
    NSError* err = nil; 

    result = [self.moc executeFetchRequest:request error:&err]; 

    NSLog(@"%@ %@", [NSThread currentThread], [NSThread isMainThread][email protected]"MAIN":@""); 
}]; 

的調用(1)也被稱爲主線程上。但我期望塊內的獲取請求在私有MOC線程上執行。正確到目前爲止?

但是,如果我檢查塊內的當前線程,它實際上是主線程! NSLog打印:

<NSThread: 0x6b10780>{name = (null), num = 1} MAIN 

檢查線程轉儲確認這一點。

fetch不應該在主線程上執行,因爲這會偶爾導致其他運行代碼發生死鎖。那麼我在這裏做錯了什麼?

回答

0

好吧,我仍然不完全確定這裏的機制,即上下文專用隊列上發佈的內容如何在主線程上結束。我懷疑它與performBlockAndWait有關,它會同步執行該塊。我已經重寫了所有內容,現在所有內容都是異步完成的,並且該塊現在在其專用線程上執行。

感謝您的所有建議。

+0

重新閱讀我上面的答案。沒有私人MOC隊列 - 您從未創建過它。 NSPrivateQueueConcurrencyType標誌只告訴Core Data如何使用它 - 它不會爲你創建隊列。你在上面的代碼中做的每件事都在主隊列中。 – 2012-07-30 12:50:46

+0

我試圖編輯上面的錯誤信息,超時了。我的更正:我的信息是iOS 4 - 對於混淆抱歉。無論如何,我認爲發生的事情是,交通部正在排隊工作,爲方便起見,你要把你傳遞給你的信息傳遞給你。因此,既然您要求它執行該操作並等待它(performBlockAndWait),它將在其線程上執行該操作,但會阻止主線程。您可以在此消息之前和之後登錄,並記下時間差異以檢驗此假設。 – 2012-07-30 12:57:52

+0

感謝您的糾正。我再次在文檔中查找它,在指定NSPrivateQueueConcurrencyType時明確指出「上下文創建並管理專用隊列」。我懷疑你所描述的事情正在發生。無論如何,它現在工作正常。 – radnoise 2012-07-30 13:19:38

相關問題