0

バックグラウンドスレッドのコアデータに関する多数の投稿を調査しましたが、何が必要かを(紙で)理解しているように感じます。私たちは見るだろうと思います。既存の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をバックグラウンドスレッドのコンテキストから正常にプルすることはありません。

4

1 に答える 1

1

本当の助けを得るには、より多くの情報を提供する必要がありますが、問題は NSManagedDocument バックグラウンド スレッドで発生しているエラーだと思います。

すべてのメッセージ (name:nil object:nil) に対して NSNotificationCenter を登録し、それらを出力するだけです。そこに失敗しているステータスの変更またはエラーメッセージが表示されるに違いありません。

例外がスローされているかどうかを確認するためだけに、その周りに @try/@catch ブロックを試してみることをお勧めします。

多分それはあなたにもっと続けることを与えるでしょう。

もう 1 つの提案... Swizzling は必ずしも実稼働用の適切なツールではありませんが、デバッグにはほとんど無敵です。各呼び出しの前後に詳細な NSNotification を送信するように、いくつかのクラス全体をメソッド交換しました。

それは私に多くの時間を節約し、いくつかの邪悪なバグを追跡するのに役立ちました. 現在、CoreData で何かが行われている場合、一連のクラスを取り出してリンクし、必要なすべての詳細を表示します。

それがあなたの質問に正確に答えるものではないことはわかっていますが、うまくいけば、あなたが軌道に乗って、さらに情報を提供してすべてを修正できるようになるでしょう.

それが多すぎる場合は、サブクラスを作成し、スーパーを呼び出すための同様のメソッドを使用してインスタンス化します。全体の流れをかなり簡単に把握できます。

于 2012-05-17T19:17:14.907 に答える