Не сломан ли пример Apple iPhone SDK 3.0 CoreDataBooks? - PullRequest
2 голосов
/ 01 октября 2009

Я столкнулся с этой проблемой в своем приложении и воспроизвел ее, используя кодовую базу Apple CoreDataBooks с 0 модификациями кода. Проблема в том, что если вы выполняете редактирование управляемого объекта и сохраняете контекст, в результате получается раздел, в котором только одна строка не имеет строк, и новый раздел, созданный с добавленным в него результирующим объектом, тогда вы получаете недопустимое исключение обновления. По-видимому, это также зависит от порядка строк.

Чтобы восстановить, выполните следующие действия:

  1. Открыть новый экземпляр примера CoreDataBooks
  2. Отредактируйте книгу Ричарда Докинза "Эгоистичный ген" и измените автора на Бена. Сохрани это. Если вы вернетесь к основному виду, то заметите, что книга находится в новом разделе с именем Бен.
  3. Отредактируйте эту книгу еще раз и смените автора на Дуга. Сохрани это. Вы получите следующее исключение:

    2009-10-01 15:14:29.050 CoreDataBooks[10898:20b] *** Assertion failure in -[UITableView_endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-963.10/UITableView.m:729 2009-10-01 15:14:29.051 CoreDataBooks[10898:20b] Serious application error.  Exception was caught during Core Data change processing: Invalid update: invalid number of rows in section 1.  The number of rows contained in an existing section after the update (2) must be equal to the number of rows contained in that section before the update (2), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted). with userInfo (null)
    

Я бы выложил код из своего собственного приложения, чтобы убедиться, что я не пропускаю ни одного обязательного метода делегата, за исключением того, что в приведенном выше примере это проблема, которая сразу же влияет на пример Apple CoreDataBooks Все методы делегата NSFetchedResultsController реализованы в соответствии с их собственными примерами. Кажется, что их код не забывает обрабатывать вновь созданные разделы, так как он работает в других случаях с другим порядком разделов.

Любая помощь будет оценена. Пример измененного кода из примера CoreDataBooks был бы отличным.

Ответы [ 2 ]

2 голосов
/ 24 октября 2009

Кажется, что это можно исправить путем изменения этих строк в разделе обновлений таблицы RootViewController:

    case NSFetchedResultsChangeMove:
  [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

  // Reloading the section inserts a new row and ensures that titles are updated appropriately.
  [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
   break;

до:

         case NSFetchedResultsChangeMove:
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
      [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
      break;

по какой-то причине. Кажется, проблема связана с удалением последней строки в разделе; похоже, что если вы не добавите дополнительные insertRows, UITableView волнуется из-за того, что удаленный раздел неожиданно получает целую кучу дополнительных строк.

Мне потребовались часы, чтобы понять это ...

2 голосов
/ 02 октября 2009

Одной из рекомендаций является полное удаление приложения с iPhone и / или сброс симулятора, чтобы убедиться, что у вас нет остатков поврежденного хранилища данных.

После удаления приложения или сброса симулятора перекомпилируйте это приложение с нуля. Это создаст новую копию приложения и, что более важно, новое хранилище данных.

После этого повторите тест, чтобы проверить, не столкнулись ли вы с той же проблемой.

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