0

別のキュー/スレッドで実行されるNSManagedObjectContextnonを持つをどのように作成しますか?nil parentContext

UIManagedDocumentのmanagedObjectContextにはこれがありますが、を使用せずに複製する方法がわかりませんUIManagedDocument

これは私が使用しているコードであり、managedObjectContextその結果、parentContextプロパティは。になりnilます。

-(NSManagedObjectContext *)context{

    if (_context == nil){
        _context = [[NSManagedObjectContext alloc] init];
        _context.persistentStoreCoordinator = self.storeCoordinator;
    }
    return _context;
}

-(NSPersistentStoreCoordinator *) storeCoordinator{
    if (_storeCoordinator == nil) {
        _storeCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.model];

        NSError *err = nil;
        if (![_storeCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                             configuration:nil
                                                       URL:self.dbURL
                                                   options:nil
                                                     error:&err ]) {

            NSLog(@"Error while adding a Store: %@", err);
            return nil;

        }
    }
    return _storeCoordinator;
}

-(NSManagedObjectModel *) model{

    if (_model == nil) {
        _model = [[NSManagedObjectModel alloc] initWithContentsOfURL:self.modelURL];
    }
    return _model;
}
4

2 に答える 2

1

子コンテキストを作成するには、子コンテキストを割り当ててその親を設定するだけです。

NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] init];
[childContext setParentContext:[self managedObjectContext]];

永続ストアコーディネーターは親コンテキストから継承されるため、子を作成するために必要なのはこれだけです。ただし、親コンテキストは、キューベースの同時実行タイプの1つを使用する必要があります。つまり、コンテキストを作成する上記のコードは、次のようなものに変更する必要があります。

_context = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSMainQueueConcurrencyType];

もありNSPrivateQueueConcurrencyTypeます。どちらが良いかは、アプリのデザインによって異なります。

ただし、別のキュー/スレッドでの実行は別の問題です。これは決して自動ではありません。コードは、呼び出し元のキューまたはスレッドで実行されます。Core Dataの直接サポートは、キューベースの同時実行タイプの1つを使用するように制限されていますが、コンテキストの操作が実際に正しいキューで行われるようにするperformBlock:か、使用する必要があります。performBlockAndWait:

于 2013-03-15T17:03:45.923 に答える
1

作成後NSManagedObjectContext、子コンテキストにする必要がある場合は、親コンテキストを割り当てる必要があります。

[newContext setParentContext:mainThreadManagedObjectContext];

この場合、永続ストアを割り当てる必要はありません。ドキュメントから:

管理対象オブジェクトコンテキストに永続ストアコーディネーターを指定するのではなく、setParentContext:を使用して親管理対象オブジェクトコンテキストを指定できるようになりました。これは、フェッチおよび保存操作がコーディネーターではなく親コンテキストによって仲介されることを意味します。

于 2013-03-15T16:25:42.160 に答える