33

Is initializing a NSManagedObjectContext using NSMainQueueConcurrencyType only for the situation where that MOC has a child MOC that was initialized using NSPrivateQueueConcurrencyType?

To give some background: my app has a traditional structure whereby the main table view is driven by a NSFetchedResultsController and data are imported asynchronously from a web service using an NSOperation subclass that has its own MOC. I wasn't sure whether both MOCs in that situation should use NSConfinementConcurrencyType (the default, I believe) or whether the MOC associated with the fetched results controller on the main thread should use NSMainQueueConcurrencyType and the background MOC should use NSConfinementConcurrencyType.

4

2 に答える 2

59

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

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

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

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

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

MOC に NSPrivateQueueConcurrencyType を使用して初期化された子 MOC がある場合にのみ、NSMainQueueConcurrencyType を使用して NSManagedObjectContext を初期化していますか?

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

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

于 2012-06-24T09:55:25.810 に答える
4

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

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

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

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

于 2012-06-24T09:58:06.793 に答える