Вопрос

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

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

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

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

    Это было полезно?

    Решение

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

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

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

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

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