Контекст основных данных “грязный”:MOC save завершает работу приложения

StackOverflow https://stackoverflow.com/questions/2234359

Вопрос

Довольно новичок в разработке 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.

Надеюсь, это поможет!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top