まず、Core Dataの新しいコンテキストタイプのレシピ。
NSMainQueueConcurrencyType
は、メインディスパッチキューとメインスレッドに関連するコンテキストを作成します。このようなコンテキストを使用して、UI要素などのメインスレッドで実行する必要があるオブジェクトにリンクすることができます。
NSPrivateQueueConcurrencyType
は、動作するプライベートディスパッチキューを作成して管理します。新しいメソッドperformBlock:
またはperformBlockAndWait:
を使用する必要があります。コンテキストは、渡されたブロックを独自のプライベートキューで実行します。
最後に、NSConfinementConcurrencyType
がデフォルトのタイプで、が作成されたスレッド内でのみ使用できます。したがって、あなたのNSOperation
の中で、あなたは正しい方法でそれを使用しました。簡単なメモ。子コンテキストとして使用する場合は、「キューコンテキスト」(NSMainQueueConcurrencyType
またはNSPrivateQueueConcurrencyType
)が必要です。
今、あなたの質問について。
はそのMOCはNSPrivateQueueConcurrencyTypeを使用して初期化された 子MOCを持っている状況に NSMainQueueConcurrencyTypeを使用してNSManagedObjectContextを初期化していますか?
いいえ、必要ありません。はい、あなたは私がバックグラウンドで動作するプライベートコンテキストを設定して、主オブジェクトにプッシュすることができますが、私は逆の作業を行います:NSPrivateQueueConcurrencyType
をマスターコンテキストとして使用し、NSMainQueueConcurrencyType
を前者の子コンテキストとして使用します。このようにして、主なコンテキストはメモリ内にあるオブジェクトのみを処理します。ディスクに保存はプライベートキューによってのみ実行されます。
このアプローチは、クラスで使用されています。ディスクに保存は、バックグラウンドスレッド(プライベートキュー)で実行されます。この方法では、UIはフリーズされません。
@Ricardo遅れて申し訳ありません。私は考えていません...しかし、コードを見ることができます。乾杯。 –
NSPrivateQueueConcurrencyTypeは、常にプライベートキュー上のブロックを実行するわけではありません。 performBlockAndWaitを使用すると、実際にはキューがロックされ、呼び出しスレッド(メインスレッド)に実行されます。 – malhal