1

iOS アプリで異常なエラーが発生しています。

私のアプリは、Core Data に挿入される大量の JSON オブジェクトをダウンロードします。ダウンロードごとに次の手順を実行します。

  1. ネットワーク接続を開き、JSON オブジェクトを取得します
  2. メインの NSManagedObject が 1 つ作成されます
  3. 0 から約 20 までの任意の数の追加の NSManagedObjects が作成されます
  4. 場合によっては、既存の NAManagedObjects のフェッチ要求を実行して既存の一致するオブジェクトを見つけ、関係を作成するか、見つからない場合は新しいオブジェクトを作成します。

関連するコード スニペットをsong次に示します。 は NSManagedObject サブクラスのインスタンスであり、Categoryは別の NSManagedObject サブクラスです。

for (NSString *category in dict[@"categories"]) {
    NSError *error;
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Category"];
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name like %@", category];
    NSArray *fetchResults = [_moc executeFetchRequest:fetchRequest error:&error];

    Category *c;

    if (fetchResults.count > 0) {
        c = fetchResults[0];
    } else {
        c = [NSEntityDescription insertNewObjectForEntityForName:@"Category" inManagedObjectContext:_moc];
        c.name = category;
    }
    [song addCategoriesObject:c];
}

これは正常に機能しますが、数百回のダウンロードと挿入の後、アプリがクラッシュします。成功したダウンロードの数は、一見ランダムに変化します。

例外の原因となっNSArray *fetchResults = [_moc executeFetchRequest:fetchRequest error:&error];ている行は次のとおりで、ログ出力は次の行です。

2014-11-17 10:05:54.265 MyApp[3211:1774124] Communications error: <OS_xpc_error: <error: 0x19ce62a80> { count = 1, contents =
    "XPCErrorDescription" => <string: 0x19ce62e78> { length = 22, contents = "Connection interrupted" }
}>
2014-11-17 10:06:03.631 MyApp[3211:1773135] *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFSet: 0x174075ac0> was mutated while being enumerated.'
*** First throw call stack:
(0x188111e48 0x198b140e4 0x1881117fc 0x187dc9cf8 0x1000965d8 0x100097de0 0x1003a4e30 0x1003a4df0 0x1003af854 0x1003a8120 0x1003b175c 0x1003b2f18 0x1993352e4 0x199334fa8)
libc++abi.dylib: terminating with uncaught exception of type NSException

このエラーを Google で検索しようとしても無駄でした。(真剣に-エラーを検索したことがなく、結果がゼロになりました:)

エラーに対する Google ヒットはゼロ

他の誰かが同様のエラーを経験し、正しい方向に向けることができますか? ここでの検索をどこから始めればよいか、完全に途方に暮れています。

4

1 に答える 1

0

クラッシュと OS_xpc_error はまったく無関係のようです。

OS_xpc_error は、デバッガーが例外ブレークポイントに到達する前に表示されました。デバッガーで続行を押すまで、例外メッセージが出力されなかったことに気づきませんでした。関連する行は __NSCFSet の変更に関するもので、問題はバックグラウンド スレッドで NSManagedObjectContext にアクセスしたことが原因でした。

この質問に従って、新しいバックグラウンド NSManagedObjectContext を作成すると、問題が解決しました。

于 2014-11-17T11:00:26.383 に答える