NSManagedObjectContext executeFetchRequest: ошибка: выдает исключение: OS_xpc_error

Я испытываю необычную ошибку в моем приложении для iOS.

Мое приложение загружает большое количество объектов JSON, которые затем вставляются в Core Data. Каждая загрузка включает следующие шаги:

  1. Откройте сетевое соединение и получите объект JSON
  2. Один главный NSManagedObject создан
  3. Любое число от 0 до около 20 дополнительных NSManagedObjects создаются
  4. Для некоторых выполняется запрос на выборку для существующих объектов NAManagedObject, чтобы найти существующие подходящие объекты, и создается связь, или создается новый объект, если он не найден.

Вот соответствующий фрагмент кода, где 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 бьет по ошибке

Кто-нибудь еще сталкивался с подобной ошибкой и может указать мне правильное направление? На этот раз я в полной растерянности относительно того, с чего начать поиск.

1 ответ

Решение

ОК, похоже, что сбой и OS_xpc_error совершенно не связаны.

OS_xpc_error появился до того, как отладчик достиг точки останова исключения. Я не осознавал, что сообщение об исключении не было напечатано до тех пор, пока я не нажал "продолжить" в отладчике. Соответствующая строка была о мутировании __NSCFSet, и проблема была связана с доступом к моему NSManagedObjectContext в фоновом потоке.

Создание нового фона NSManagedObjectContext, согласно этому вопросу, решило мою проблему.

Другие вопросы по тегам