NSFetchedResultsController Crash - PullRequest
       7

NSFetchedResultsController Crash

1 голос
/ 13 сентября 2009

Следующие шаги приводят к сбою в NSFetchedResultsController.

  1. Я пытаюсь добавить первый элемент в TableView, поддерживаемый NSFetchedResultsController.
  2. Я создаю временный объект MO и отображаю панель модального вида для добавления нового объекта.
  3. На панели «Добавить лист» (контроллер модального вида) я нажимаю кнопку «Отмена», чтобы удалить новый элемент.
  4. В обратном вызове CancelAction для кнопки «Отмена» я удаляю созданный мной новый временный объект.
  5. Код до здесь в точности похож на пример кода Apple для Core Data. Единственный дополнительный код, который у меня есть, - это вызов [tableView reloadData] после закрытия листа добавления.
  6. Сбой возникает, только если я пытаюсь добавить первый элемент, так как он связан с неправильным счетчиком разделов в NSFetchedResultsController.

Это приводит к падению, указанному ниже. Если я удаляю избыточный вызов reloadData, сбой не виден. Если я добавлю вызов reloadData к образцу кода рецепта, там также произойдет сбой.

Это известная проблема с NSFetchedResultsController?

2009-09-13 18: 22: 45.600 Рецепты [14926: 20b] * Завершение работы приложения из-за необработанного исключения 'NSRangeException', причина: '* - [NSCFArray objectAtIndex:]: index (0 ) за пределами (0) '

1 Ответ

4 голосов
/ 13 сентября 2009

Как вы обнаружили самостоятельно, вам НЕ следует использовать [tableView reloadData], потому что вы, вероятно, используете методы делегата NSFetchedResultsController

– controllerWillChangeContent:
– controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
– controller:didChangeSection:atIndex:forChangeType:
– controllerDidChangeContent:

Эти методы фактически отвечают за обновление вашего табличного представления при добавлении, удалении или изменении объектов. Поэтому, когда вы добавляете вызов к [tableView reloadData], происходит то, что два разных потока одновременно осуществляют доступ к вашему табличному представлению и изменяют его. Это вызывает сбой, который вы испытываете.

Если вы не используете методы делегата, то сбой происходит из-за чего-то еще в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...