基本的に自分のアプリでは1つのモックしか使っていませんが、場合によっては複数の NSManagedObjectContext を使うべきだと思います。
- 複数の NSManagedObjectContext をいつ使用する必要がありますか?
- 場合によっては3mocを使ったほうがいいと聞いたのですが、どのような場合に3mocを使えばいいのかわからないのですが?
通常、NSManagedObjectContext
Core Data db にアクセスするスレッドごとに個別の を使用します。これは、同じコンテキストへの同時書き込みが原因で、オブジェクト グラフが不整合な状態になる可能性を防ぐためです。
NSManagedObjectContext
これを処理する最も簡単な方法は、スレッドごとに新しい を作成し、単一の を共有することNSPersistentStoreCoordinator
です。
タイプの AppDelegate にプロパティを作成しNSManagedObjectContext
、getter をオーバーライドして、呼び出しスレッドごとに新しいコンテキストを返します。threadDictionary
これは、各スレッドの を利用して行います。
まず、通常どおりに managedObjectModel と persistentStoreCoordinator を設定します。次に、AppDelegate でコンテキストを作成し、プロパティに割り当てます。
self.managedObjectContext = [[NSManagedObjectContext alloc] init];
self.managedObjectContext.persistentStoreCoordinator = self.storeCoordinator;
managedObjectContext ゲッター オーバーライドで、次のコードを使用して、呼び出しスレッドごとに個別のコンテキストを返します。
- (NSManagedObjectContext *) managedObjectContext
{
NSThread *thisThread = [NSThread currentThread];
if (thisThread == [NSThread mainThread])
{
//For the Main thread just return default context iVar
return _managedObjectContext;
}
else
{
//Return separate MOC for each new thread
NSManagedObjectContext *threadManagedObjectContext = [[thisThread threadDictionary] objectForKey:@"MOC_KEY"];
if (threadManagedObjectContext == nil)
{
threadManagedObjectContext = [[[NSManagedObjectContext alloc] init];
[threadManagedObjectContext setPersistentStoreCoordinator: [self storeCoordinator]];
[[thisThread threadDictionary] setObject:threadManagedObjectContext forKey:@"MOC_KEY"];
}
return threadManagedObjectContext;
}
}
これで、AppDelegate の managedObjectContext プロパティにアクセスするコード内のどこでも、確実にスレッド セーフになります。
次のリンクは、複数の管理対象オブジェクト コンテキストをいつ、なぜ、どのように使用するかを明確に説明しています。
複数の管理対象オブジェクト コンテキストを使用する 2 つの主な理由を次に示します。
NSManagedObjectContext
はスレッドセーフではないため、スレッドNSManagedObjectContext
セーフにする。NSManagedObjectContext
、UI にデータを表示します。これは、UI にデータを表示し、サーバーからデータをフェッチする場合、NSManagedObjectContext
並行性と UI のブロックの問題を回避するために、子でデータをフェッチする必要があることを意味します。スレッドごとに異なる「モック」を使用する
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreData/Concurrency.html