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不應該在主線程上執行,因爲這會偶爾導致其他運行代碼發生死鎖。那麼我在這裏做錯了什麼?
重新閱讀我上面的答案。沒有私人MOC隊列 - 您從未創建過它。 NSPrivateQueueConcurrencyType標誌只告訴Core Data如何使用它 - 它不會爲你創建隊列。你在上面的代碼中做的每件事都在主隊列中。 – 2012-07-30 12:50:46
我試圖編輯上面的錯誤信息,超時了。我的更正:我的信息是iOS 4 - 對於混淆抱歉。無論如何,我認爲發生的事情是,交通部正在排隊工作,爲方便起見,你要把你傳遞給你的信息傳遞給你。因此,既然您要求它執行該操作並等待它(performBlockAndWait),它將在其線程上執行該操作,但會阻止主線程。您可以在此消息之前和之後登錄,並記下時間差異以檢驗此假設。 – 2012-07-30 12:57:52
感謝您的糾正。我再次在文檔中查找它,在指定NSPrivateQueueConcurrencyType時明確指出「上下文創建並管理專用隊列」。我懷疑你所描述的事情正在發生。無論如何,它現在工作正常。 – radnoise 2012-07-30 13:19:38