これまでの私のアプローチは次のようなものでした。
1- 次のように初期化されたメイン コンテキスト:
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.model]; if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { DDLogModel(@"Unresolved error %@", error.localizedDescription); return; } self.context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; self.context.persistentStoreCoordinator =_persistentStoreCoordinator;
2- 次に、コア データ オブジェクトを作成したり、それらの関係を同時に変更したりします。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSManagedObjectContext *tempContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType]; tempContext.persistentStoreCoordinator = self.persistentStoreCoordinator; // Do stuff [tempContext save:nil]; });
3- そして最後に、メイン コンテキストが
NSManagedObjectContextDidSaveNotification
ただし、最近、ステップ 2 で、代わりに でコンテキストを作成し、NSPrivateQueueConcurrencyType
それをメイン コンテキストの子にし、-performBlock:
この最後のアプローチはデフォルトで並行していますか (明示的にディスパッチしなくても)? または、私が説明したアプローチよりも優れている点は何ですか?
私を失望させたもう 1 つのことは、コンテキストにはプロパティparentContext
とpersistentStoreCoordinator
プロパティがあるにもかかわらず、後者を設定すると前者を設定できないことを意味するように見えることです。つまり、永続的なストア コーディネーターを持つコンテキストは、実際にはそのストア コーディネーターを親コンテキストとして持っていますか?
更新:
もう 1 つの興味深い点は、上記で説明した (GCD を使用した) アプローチでは、ときどき[tempContext save:]
奇妙な動作が発生することです: エラーは返されません (例とは異なり、NSError オブジェクトを渡すと仮定します)、しかし、Objective-C の一般的な例外ポインターをオンに設定すると、例外が発生したかのように、バックグラウンド スレッドがそこで停止します。ただし、続行すると、アプリはクラッシュせずに続行され、メインのモックは問題ないようです。