2012-06-24 6 views
27

を使用してNSManagedObjectContextを初期化していますが、そのMOCにはNSPrivateQueueConcurrencyTypeを使用して初期化された子MOCがありますか?Core DataのNSMainQueueConcurrencyTypeをいつ使用するのですか?

私のアプリは、メインテーブルビューがNSFetchedResultsControllerで駆動され、データはWebサービスから、独自のMOCを持つNSOperationサブクラスを使用して非同期にインポートされる従来の構造を持っています。私はその状況で両方のMOCがNSConfinementConcurrencyType(デフォルト、私は信じる)を使うべきか、またはメインスレッドのフェッチされた結果コントローラに関連するMOCがNSMainQueueConcurrencyTypeを使用し、バックグラウンドMOCがNSConfinementConcurrencyTypeを使用すべきかどうかを確かめなかった。

答えて

51

まず、Core Dataの新しいコンテキストタイプのレシピ。

NSMainQueueConcurrencyTypeは、メインディスパッチキューとメインスレッドに関連するコンテキストを作成します。このようなコンテキストを使用して、UI要素などのメインスレッドで実行する必要があるオブジェクトにリンクすることができます。

NSPrivateQueueConcurrencyTypeは、動作するプライベートディスパッチキューを作成して管理します。新しいメソッドperformBlock:またはperformBlockAndWait:を使用する必要があります。コンテキストは、渡されたブロックを独自のプライベートキューで実行します。

最後に、NSConfinementConcurrencyTypeがデフォルトのタイプで、が作成されたスレッド内でのみ使用できます。したがって、あなたのNSOperationの中で、あなたは正しい方法でそれを使用しました。簡単なメモ。子コンテキストとして使用する場合は、「キューコンテキスト」(NSMainQueueConcurrencyTypeまたはNSPrivateQueueConcurrencyType)が必要です。

今、あなたの質問について。

はそのMOCはNSPrivateQueueConcurrencyTypeを使用して初期化された 子MOCを持っている状況に NSMainQueueConcurrencyTypeを使用してNSManagedObjectContextを初期化していますか?

いいえ、必要ありません。はい、あなたは私がバックグラウンドで動作するプライベートコンテキストを設定して、主オブジェクトにプッシュすることができますが、私は逆の作業を行います:NSPrivateQueueConcurrencyTypeをマスターコンテキストとして使用し、NSMainQueueConcurrencyTypeを前者の子コンテキストとして使用します。このようにして、主なコンテキストはメモリ内にあるオブジェクトのみを処理します。ディスクに保存はプライベートキューによってのみ実行されます。

このアプローチは、クラスで使用されています。ディスクに保存は、バックグラウンドスレッド(プライベートキュー)で実行されます。この方法では、UIはフリーズされません。

+1

@Ricardo遅れて申し訳ありません。私は考えていません...しかし、コードを見ることができます。乾杯。 –

+0

NSPrivateQueueConcurrencyTypeは、常にプライベートキュー上のブロックを実行するわけではありません。 performBlockAndWaitを使用すると、実際にはキューがロックされ、呼び出しスレッド(メインスレッド)に実行されます。 – malhal

3

NSMainQueueConcurrencyTypeは、主にUIにリンクされたコンテキスト用です。

UIの応答性を維持するために、ビジネスロジックのほとんどは、バックグラウンドスレッドと「バックグラウンド」コンテキストで行うのが最善です。しかし、UI自体はある時点でコンテキストを使用する必要があります。つまり、NSMainQueueConcurrencyTypeです。

NSMainQueueConcurrencyTypeの子コンテキストは、変更を一度に保存できる、つまり親コンテキストにコミットするペインの編集に適しています。親はNSMainQueueConcurrencyTypeを使用する必要はありません。

NSConfinementConcurrencyTypeがデフォルトです。これはコンテキストを現在のスレッドにリンクしています。デフォルトのタイプに依存するのではなく、最も単純なアプリケーションに依存するべきです。 NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyTypeは、すべてのコンテキストでどのキューが使用されているかを正確に把握しているので最適です。

関連する問題