2016-05-07 4 views
0

でそれらの一つは、そうのような親/子managedObjectContextsを使用しているCoreDataは、同時実行CoreDataで複数のコンテキスト

で並行処理を扱ういくつかの方法があります我々はchildCoにperformBlockを使用する必要がありますので

let mainContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) 
let childContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) 

childContext.persistentStoreCoordinator = mainContext.persistentStoreCoordinator 

:子コンテキストが同じpersistentStoreCoordinatorそうように使用しますntext以降では、mainContextにフェッチなどを保存または実行すると、これら2つの方法の違いは何ですか?

Iは、好ましい方法である(私は試み、それがなかった)メインスレッド上で前者の方法と後者ことFlorian Kugler's blogで読み取ります。しかし、私が見たサイトはすべて、元の親/子のコンテキストを好むようです。

するRayWenderLichのCoreDataブック(参照の章10)に、物事はさらに混乱させるために、彼らは理由を説明せずにアプローチの両方を使用しました。

答えて

0

は、理想的には単一p​​ersistentStoreコアデータアプリケーションに並列性を達成するために3の単純なルールがあります。

  1. つのみ管理オブジェクトコンテキスト(MOC)persistentStoreCoordinatorと凝乳操作にロック解除、MOCロックを回避するための基本的なルールで取り付けられなければなりません。
  2. すべてのMOCは、メインスレッドMOC、バックグラウンドスレッドMOCのような1つのスレッドで接続する必要があります。
  3. 管理対象オブジェクトをMOC(スレッド)から他のMOC(スレッド)に渡すことはできません。この場合、ObjectIDを渡すだけです。すべての3つのルールを達成するために

、リンゴは親子MOCのアプローチを紹介します。 しかし、各スタック(親子MOCアプローチ)は、アプリケーションデータのユーザビリティに大きく依存しています。

私はメインのMOCコンテキストとしてpersistentStoreCoordinatorを使用し、新しいレコード画面を作成するためにView Controllerごとに と多くのローカル子MOCを作成しました。これは私のためにうまく動作し、DBに3500レコードの挿入をテストします。 これを行う利点私は、更新されたサーバーの同期データをメインのMOCで取得しています。

私は非同期にそれを最小化するための要求をフェッチ、私はメインスレッドをブロックします、しかし、あなたは、バッチ更新を利用することができ、削除することを、アプローチのためのいくつかの批評家を知っています。

+0

ブロックメインスレッドはMainQueue(mainContext)上で行わなければならないI/O動作である事。したがって、バッチ更新は、引き続きi/oと同じ効果を持ちます。また、非同期フェッチ要求の場合、PersistantStoreCoordinatorは1つであるため、CRUDが終了するまでロックされ、UIはまだブロックされます。私が間違っている? – Mehrdadmaskull

+0

あなたは正しいです。しかし、データの同期私はdispatch_async()ブロック内でそれを呼び出すと、それはちょうどメインのMOCのセーブコールだったので、問題になりたい。他の場所では、私は重い操作をしていませんでした。したがって、3レベルのMOCを維持する代わりに、それは私にとって価値があります。 – kaushal

+0

新しいレコードを作成するために、私は一時MOCを使用しています。これは、後でメインMOCに保存されます。3レベルの親子MOCはあなたのメインスレッドをブロックしませんが、バッチ更新や操作の作成には時間がかかりますが、それぞれのアプローチには散文と円錐があります。 – kaushal

関連する問題