1

これまでの私のアプローチは次のようなものでした。

  • 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 つのことは、コンテキストにはプロパティparentContextpersistentStoreCoordinatorプロパティがあるにもかかわらず、後者を設定すると前者を設定できないことを意味するように見えることです。つまり、永続的なストア コーディネーターを持つコンテキストは、実際にはそのストア コーディネーターを親コンテキストとして持っていますか?

更新: もう 1 つの興味深い点は、上記で説明した (GCD を使用した) アプローチでは、ときどき[tempContext save:]奇妙な動作が発生することです: エラーは返されません (例とは異なり、NSError オブジェクトを渡すと仮定します)、しかし、Objective-C の一般的な例外ポインターをオンに設定すると、例外が発生したかのように、バックグラウンド スレッドがそこで停止します。ただし、続行すると、アプリはクラッシュせずに続行され、メインのモックは問題ないようです。

4

1 に答える 1

0

あなたが正しいです。performBlockバックグラウンドで自動的に作業を実行します。場合によっては、現在のスレッド (メインまたはバックグラウンド) を使用することが理にかなっている場合がありますperformBlockAndWait。子コンテキストを使用することをお勧めします。

あなたのセットアップも同様に機能すると思います。子コンテキストを使用する利点は、保存のより構造化されたアプローチ、つまり保存を親コンテキストに「プッシュアップ」することにあると思います。親コンテキストのみが実際に永続ストアにアクセスするため、これはスレッド セーフの点で優れています。

あなたの最後の質問は明確ではありません。コンテキストは、永続ストア コーディネーターではなく、親コンテキストとしてのみコンテキストを持つことができます。ただし、混乱を招く可能性があるのは、iOS 5 より前は「親ストア」しかなく、子コンテキストの導入により、必要に応じて親コンテキストに置き換えることができることです。詳細はこちらをご覧ください。

于 2013-10-24T08:18:03.533 に答える