1

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

スレッド ダンプを確認すると、これが確認されます。

メインスレッドでフェッチを実行しないでください。実行中の他のコードでデッドロックが発生することがあるためです。それで、私はここで何が間違っていますか?

4

1 に答える 1

0

わかりました。ここでの仕組み、つまり、コンテキストプライベートキューに投稿されたものがメインスレッドにどのように配置されるかについては、まだ完全にはわかりません。ブロックを同期的に実行するperformBlockAndWaitに関係しているのではないかと思います。私はものを書き直したので、すべてが非同期で実行され、ブロックはプライベートスレッドで実行されます。

すべての提案をありがとう。

于 2012-07-30T12:03:01.517 に答える