Это сделано, потому что вы можете обновить ячейки, когда они уже на экране. Вместо того, чтобы полностью обновить ячейку, вы можете просто извлечь существующую ячейку из табличного представления и запустить ее через configureCell:atIndexPath:
. Если метод реализован правильно, он обновит все данные в ячейке без UITableView, удалит старую ячейку, удалит из очереди или выделит новую ячейку и выведет ее на экран.
Для исторического интереса:
Насколько я знаю, я парень, который отвечает за configureCell:atIndexPath:
. Я уверен, что другие люди придумали ту же идею, но я верю, что фрагмент кода, который популяризировал его, был изначально написан мной. Затем он был распространен Apple и стал конвенцией.
Ранние версии NSFetchedResultsControllerDelegate
имели метод controllerDidChangeContent:
, но не вызывали controllerWillChangeContent:
, что означало, что не было возможности вызвать -[UITableView beginUpdates]
до изменения содержимого табличного представления.
Я подал Radar # 6708453 с просьбой добавить этот метод делегата и включил пример кода, чтобы показать им, что я хочу сделать. Этот код имел действительную логику обновления ячейки в вызове refreshCell:atIndexPath:
, так что он мог вызываться как из tableView:cellForRowAtIndexPath:
, так и controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
.
Когда вышло следующее начальное бета-тестирование, я обнаружил, что команда разработчиков iOS не только добавила предложенный мной метод, но и скопировала пример кода из моего отчета об ошибках в документацию NSFetchedResultsControllerDelegate , хотя они мудро изменились имя для менее запутанных configureCell:atIndexPath:
.
Сегодня я фактически начал новый проект с шаблоном Core Data для основных / подробных данных iOS и заметил, что мой код - и метод configureCell:atIndexPath:
с ним - был в шаблоне. Я запустил быстрый поиск в Google, чтобы увидеть, стало ли это общим соглашением. Кажется, что это так. Я горжусь тем, что этот маленький кусок кода сделал из себя!