2

メインスレッド以外のスレッドでフェッチ要求を実行できるように、NSManagedObjectContextの新しいインスタンスを作成しようとしています。私が理解しているように、ストアを共有することはできますが、各スレッドには独自のインスタンスが必要です。

私のアプリはコアデータドキュメントベースのアプリです。

ここで少し読んだので、私はこのコードを手に入れました:

NSManagedObjectContext *managedObjectContextForThread = nil;
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];

if (coordinator != nil) {
    managedObjectContextForThread = [[NSManagedObjectContext alloc] init];
    [managedObjectContextForThread setPersistentStoreCoordinator:coordinator];
    [managedObjectContextForThread setUndoManager:nil];
}

実行されますが、フェッチを実行しても結果が得られません。NSPersistentStoreCoordinatorが正しくセットアップされていないためと思われます。

そのストアコーディネーターをメインストアと連携するように設定するにはどうすればよいですか?それとも私がここで見逃している何かがありますか?

4

2 に答える 2

5

Appleの「一般的に推奨されるアプローチ」は、コンテキスト間で1人の永続的なストアコーディネーターを共有することです。理想的には、アプリのメイン管理対象オブジェクトコンテキストへの参照がすでにあり、そのコンテキストの永続ストアコーディネーターを使用します。

NSManagedObjectContext *managedObjectContextForThread = [[NSManagedObjectContext alloc] init];;
[managedObjectContextForThread setPersistentStoreCoordinator:myMainContext.persistentStoreCoordinator];

AppleのCoreDataプログラミングガイドの「ConcurrencyWithCoreData」をご覧ください。

于 2013-03-21T17:07:05.347 に答える
0

永続ストアをストア コーディネーターに追加してから、永続ストアを管理対象オブジェクト コンテキストに追加する必要があります。

if ( [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:0 URL:storeUrl options:options error:&error] ) {
    managedObjectContextForThread = [[NSManagedObjectContext alloc] init];
    [managedObjectContextForThread setPersistentStoreCoordinator:coordinator];
}
else {
// investigate 'error'
}
于 2013-03-21T17:04:35.060 に答える