2010-02-10 2 views
1

Довольно новый для iPhone dev. Мое приложение использует Core Data, и в какой-то момент я пытаюсь сохранить некоторые данные во время метода NSFetchedResultsControllerDelegate:Основные данные Контекст «грязный»: MOC save crashes app

- (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 или обработчиком уведомлений. с userInfo (null)

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

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

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

Cheers, Аарон

ответ

3

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

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.

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

+1

Спасибо вам обоим. Маркус, ваша записка о методе делегата, вызванная спасением MOC, действительно закритировала его для меня. Я должен пойти купить твою книгу или что-то ... :-) –