web-dev-qa-db-ja.com

NSManagedObjectContextのperformBlockは何に使用されますか?

IOS 5では、NSManagedObjectContextにいくつかの新しいメソッドperformBlock:およびperformBlockAndWait:。これらの方法は実際に何に使用されますか?古いバージョンでは何が置き換えられますか?どのような種類のブロックが渡されることになっていますか?どちらを使用するかを決定するにはどうすればよいですか?誰かがそれらの使用のいくつかの例を持っているならば、それは素晴らしいでしょう。

66
nevan king

メソッドperformBlock:およびperformBlockAndWait:は、NSManagedObjectContextまたはNSPrivateQueueConcurrencyTypeを使用してMOCが初期化された場合にNSMainQueueConcurrencyTypeインスタンスにメッセージを送信するために使用されます。永続ストアの設定や変更の保存など、これらのコンテキストタイプのいずれかで何かを行う場合は、ブロックで行います。

performBlock:は、ブロックをバッキングキューに追加し、独自のスレッドで実行するようにスケジュールします。ブロックはすぐに戻ります。これは、バッキングストアへの長時間の永続化操作に使用できます。

performBlockAndWait:は、ブロックをバッキングキューに追加し、独自のスレッドで実行するようにスケジュールします。ただし、ブロックは実行が完了するまで戻りません。操作が成功したかどうかを確認するまで先に進むことができない場合は、これが選択です。

例えば:

__block NSError *error = nil;
[context performBlockAndWait:^{
    myManagedData.field = @"Hello";
    [context save:&error];
}];

if (error) {
    // handle the error.
}

performBlockAndWait:、ブロック外のエラーにアクセスできます。 performBlock:には別のアプローチが必要です。

iOS 5コアデータリリースノート から:

NSManagedObjectContextは、並行操作の構造化されたサポートを提供するようになりました。 initWithConcurrencyType:を使用して管理対象オブジェクトコンテキストを作成する場合、スレッド(キュー)の関連付けには3つのオプションがあります。

  • 制限(NSConfinementConcurrencyType)。

    これがデフォルトです。コンテキストは、作成したスレッド以外のスレッドでは使用されないことを約束します。 (これは、以前のリリースで使用していたスレッド化要件とまったく同じです。)

  • プライベートキュー(NSPrivateQueueConcurrencyType)。

    コンテキストはプライベートキューを作成および管理します。コンテキストが関連付けられているスレッドまたはキューを作成および管理する代わりに、ここではコンテキストがキューを所有し、すべての詳細を管理します(以下で説明するブロックベースのメソッドを使用する場合)。

  • メインキュー(NSMainQueueConcurrencyType)。

    コンテキストはメインキューに関連付けられており、アプリケーションのイベントループに関連付けられていますが、それ以外はプライベートキューベースのコンテキストに似ています。このキュータイプは、メインスレッドでのみ使用する必要があるコントローラーおよびUIオブジェクトにリンクされたコンテキストに使用します。

124
MikeG