iOS5 では、次のように NSPrivateQueueConcurrencyType で作成する NSManagedObjectContext があります。
self.moc = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] autorelease];
moc.parentContext = rootContext;
これはメイン スレッドで実行されますが、MOC が独自のキューを取得するため、ドキュメントを正しく理解していれば問題ありません。
さて、ある時点で、次のようにフェッチ リクエストを実行します。
[self.moc performBlockAndWait:^() { // (1)
NSError* err = nil;
result = [self.moc executeFetchRequest:request error:&err];
NSLog(@"%@ %@", [NSThread currentThread], [NSThread isMainThread]?@"MAIN":@"");
}];
呼び出し (1) もメインスレッドで呼び出されます。しかし、ブロック内のフェッチ要求がプライベート MOC スレッドで実行されることを期待しています。ここまで正解?
しかし、ブロック内の現在のスレッドを確認すると、実際にはメインスレッドです! NSLog は以下を出力します。
<NSThread: 0x6b10780>{name = (null), num = 1} MAIN
スレッド ダンプを確認すると、これが確認されます。
メインスレッドでフェッチを実行しないでください。実行中の他のコードでデッドロックが発生することがあるためです。それで、私はここで何が間違っていますか?