2009-09-13 2 views
1

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

  1. Я пытаюсь добавить первый элемент в поддерживаемый NSFetchedResultsController TableView.
  2. Я создаю временный объект MO и покажу панель Modal View для добавления нового объекта.
  3. На странице «Добавить лист» (Modal View Controller) я нажимаю кнопку «Отмена», чтобы отменить новый элемент.
  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]: индекс (0) за пределы (0)»

ответ

4

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

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

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

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

+0

Я установил делегат для NSFetchedResultsController, но у меня еще нет этих функций. Если я удалю делегата, проблема исчезнет. Таким образом, это подтверждает поведение. Есть ли какие-либо документы, которые говорят о NSFetchedResultsController более подробно, чем документы API? Я не видел этого поведения, упомянутого там. Пожалуйста, дайте мне знать и спасибо за всю помощь. – siasl

+0

К сожалению, насколько мне известно, нет других документов помимо API (по крайней мере, никаких других документов, связанных с наблюдаемым поведением). То, что я сказал, основано на моем личном опыте. –

Смежные вопросы