バックグラウンドスレッドのコアデータに関する多数の投稿を調査しましたが、何が必要かを(紙で)理解しているように感じます。私たちは見るだろうと思います。既存のOSXアプリをCoreDataに移行する作業を行っていますがNSManagedObject
、非同期スレッドで新しいインスタンスを作成する際に問題が発生します。
これは、バックグラウンドスレッドに移動した直後に実行しているコードのサンプルです。
NSLog(@"JSON 1");
NSManagedObjectContext * context = [[NSManagedObjectContext alloc] init];
[context setPersistentStoreCoordinator:[[NSApp delegate] persistentStoreCoordinator]];
asset = (MTAssetInfo*)[NSEntityDescription insertNewObjectForEntityForName:@"Info" inManagedObjectContext:context];
NSLog(@"JSON 2");
その結果、最初のログメッセージ(@"JSON 1")
は31回呼び出され、2番目のログメッセージは呼び出され(@"JSON 2")
ません。オブジェクトが作成されておらず、正しく返されていません。
このInfo
エンティティのモデルは非常に複雑で、正しく設定されている場合とされていない場合があるいくつかの変換可能な属性があります。奇妙なことに、同様のコードがメインスレッドで実行され、メインMOCがうまく機能します。問題ない。
編集-もう少しコンテキスト
非同期呼び出しはここから発生します。
for (NSNumber *sectionID in sectionsToShow) {
dispatch_group_async(group, queue, ^{
MTAssetInfo *asset = [self assetWithRefID:[sectionID unsignedIntegerValue]];
if (asset != nil) {
[sectionsLock lock];
[sectionsTemp addObject:asset];
[sectionsLock unlock];
}
});
}
他のassetWithRefID
コードスニペットがあるため、メソッドがオブジェクトとともに戻ることはありません。NSManagedObjectをバックグラウンドスレッドのコンテキストから正常にプルすることはありません。