Базовый контекст данных "грязный": приложение MOC save аварийно завершает работу - PullRequest
1 голос
/ 10 февраля 2010

Довольно новый для iPhone dev. Мое приложение использует 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;

Теперь, когда я сделаю это, рассматриваемый объект будет удален после неизбежного сбоя. Так что что-то правильное происходит. Авария интересная, хотя:

Серьезная ошибка приложения. Исключительная ситуация при обработке изменений базовых данных: не удалось обработать ожидающие изменения перед сохранением. Контекст все еще грязный после 100 попыток. Обычно это рекурсивное загрязнение вызвано неправильным методом проверки, -willSave или обработчиком уведомлений. with userInfo (null)

2010-02-09 23: 02: 03.931 app2 [26664: 207] *** Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Не удалось обработать ожидающие изменения перед сохранением. Контекст все еще грязный после 100 попыток. Обычно это рекурсивное загрязнение вызвано неправильным методом проверки, -willSave или обработчиком уведомлений. '

Мое исследование показало очень ограниченные результаты - хорошо, что я здесь, чтобы документировать это, а? :-) Но моя интуиция говорит, что MOC записывается в другом месте моего контроллера, хотя я не могу найти никаких доказательств этого. У метода viewDidLoad есть NSFetchedResultsController, используемый для получения начальных данных, но это все.

Есть предложения, что здесь может быть не так? Как обычно, ваш улей в сообществе очень ценится!

Приветствия, Аарон

1 Ответ

3 голосов
/ 10 февраля 2010

(если я правильно понимаю проблему) Я думаю, что все, что вам нужно сделать в этом случае:

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.

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

...