Контекст основных данных “грязный”:MOC save завершает работу приложения
-
19-09-2019 - |
Вопрос
Довольно новичок в разработке iPhone.Мое приложение использует Core Data, и в какой-то момент я пытаюсь сохранить некоторые данные с помощью метода NSFetchedResultsControllerDelegate:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
Большую часть этого я почерпнул прямо из документации Apple по данному вопросу.Действие удаления выглядит следующим образом:
case NSFetchedResultsChangeDelete:
[managedObjectContext deleteObject:anObject];
NSError *error;
if (![managedObjectContext save:&error]) {
NSLog(@"WTF? %@", [error description]);
}
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
Теперь, когда я это сделаю, объект, о котором идет речь, будет удален после неизбежного сбоя.Значит, происходит что-то правильное.Тем не менее, авария интересна:
Серьезная ошибка приложения.Во время обработки изменений Core Data было обнаружено исключение: не удалось обработать ожидающие изменения перед сохранением.Контекст по-прежнему загрязнен после 100 попыток.Обычно это рекурсивное загрязнение вызвано неправильным методом проверки, -willSave или обработчиком уведомлений.с userInfo (нулевым значением)
2010-02-09 23:02: 03.931 app2[26664: 207] *** Завершение работы приложения из-за неперехваченного исключения 'NSInternalInconsistencyException', причина:'Не удалось обработать ожидающие изменения перед сохранением.Контекст по-прежнему загрязнен после 100 попыток.Обычно это рекурсивное загрязнение вызвано неправильным методом проверки, -willSave или обработчиком уведомлений.'
Мое исследование дало несколько очень ограниченных результатов - хорошо, что у меня есть здесь документальное подтверждение этого, а?:-) Но мое чутье подсказывает, что MOC записывается в другое место моего контроллера, хотя я не могу найти никаких доказательств того, что это происходит.В методе viewDidLoad для получения исходных данных используется NSFetchedResultsController, но это все.
Есть какие-нибудь предложения о том, что здесь может быть не так?Как обычно, мы очень ценим ваш коллективный разум, основанный на сообществе!
Твое здоровье, Аарон
Решение
(Если я правильно понимаю проблему) Я думаю, что все, что вам нужно сделать в этом случае, это:
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
Помните этот метод
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
получает уведомление после изменения базовых данных.Поэтому я считаю, что ваш объект уже удален, вам не нужно удалять его вручную.Все, что осталось сделать в этом методе, это удалить его из TableView.
Надеюсь, это поможет!