4

本当に簡単な質問です。私のコア データ UIManagedDocument はメイン スレッドで作成されます。

dispatch_queue_t backgroundQueue = dispatch_queue_create("DownloadQueue", NULL);
dispatch_async(backgroundQueue, ^{
    // Get data from web
    [document.managedObjectContext performBlock:^{
        // Add data to Core Data
    }];
});
4

2 に答える 2

2

Apple のリリース ノートを読むことができます: iOS5 の CoreData リリース ノート

OS X v10.7 および iOS 5 より前のバージョンと同様に、confinement パターンを使用してコンテキストを使用できます。コンテキスト メッセージを直接送信します。正しいキューからメッセージを送信することを確認するのはあなた次第です。

2 つの新しいメソッド performBlock: および performBlockAndWait: と組み合わせて、キューベースの同時実行タイプを使用してコンテキストを使用します。これらのメソッドの 1 つに渡すブロック内のコンテキスト (永続ストア コーディネーターの設定などの初期化を含む) に送信する "標準" メッセージをグループ化します。1 つの例外は、コードがメイン スレッドで実行されている場合、ブロック ベースの API を使用する代わりに、メイン キュー スタイルのコンテキストでメソッドを直接呼び出すことができることです。

performBlock: および performBlockAndWait: コンテキストに指定されたキューでブロック操作が実行されるようにします。performBlock: メソッドはすぐに戻り、コンテキストは独自のスレッドでブロック メソッドを実行します。performBlockAndWait: メソッドを使用すると、コンテキストは引き続き独自のスレッドでブロック メソッドを実行しますが、ブロックが実行されるまでメソッドは戻りません。

ブロックは別個の一連の作業として実行されることを理解することが重要です。ブロックが終了するとすぐに、他の誰かが別のブロックをキューに入れたり、変更を元に戻したり、コンテキストをリセットしたりできます。したがって、ブロックは非常に大きくなる可能性があり、通常は save: を呼び出すことで終了します。

于 2012-10-04T20:57:39.163 に答える
0

UIManagedDocumentmanagedObjectContextを使用すると、(OS X v10.7 および iOS 5 以前と同様に) デフォルトの Confinement type に相当するものを使用して作成されますNSConfinementConcurrencyType。簡単に言えば、この同時実行タイプは、コンテキストを最初に作成したスレッド以外のスレッドでは使用されないことを指定します。

この場合UIManagedDocument(およびそのコンテキスト) はメイン スレッドで作成され、メッセージングperformBlock:は​​関連するブロックをメイン スレッドで実行します。を使用performBlock:することで、managedObjectContext が作成されたスレッドを実際に知る必要はありません。メッセージングperformBlock:は​​常に、コンテキストが存在する同じスレッドで関連するブロックを実行します。

于 2012-10-08T12:24:36.550 に答える