UITableViewCell плохая производительность с AutoLayout
Я немного застрял с этим ... любая помощь очень ценится. Я'Я уже потратил много времени на отладку этого.
у нас естьUITableView
с источником данных, предоставленнымNSFetchedResultsController
, В отдельном контроллере представления я вставляю новые записи в CoreData, используя[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]
сохранить контекст управляемого объекта и закрыть этот контроллер. Очень стандартные вещи.
Изменения в контексте управляемого объекта затем принимаются:NSFetchedResultsController
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.tableView beginUpdates];
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
switch (type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationNone];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
break;
case NSFetchedResultsChangeUpdate:
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
break;
case NSFetchedResultsChangeMove:
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationNone];
break;
}
}
И здесь возникает проблема - это займет слишком много времени (около 3-4 секунд на iPhone 4), чтобы сделать это. И кажется, что время потрачено на вычисление макета для ячеек.
мы удалили все из ячейки (включая пользовательский подкласс) и оставили его простоUILabel
, но ничего не изменилось. Затем я'Мы изменили стиль ячейки на Базовый (или что-нибудь кроме Пользовательского), и проблема исчезла - новые клетки добавляются мгновенно.
мы дважды проверили иNSFetchedResultsControllerDelegate
обратные вызовы вызываются только один раз. Если я их игнорирую и делаю[UITableView reloadSections:withRowAnimation:]
ничего не меняется - это все еще очень медленно.
Мне кажется, что Auto Layout отключен для стилей ячеек по умолчанию, что делает их очень быстрыми. Но если это так - почему все загружается быстро, когда я нажимаю?UITableViewController
Вот's трассировка вызова для этой проблемы:
Так что вопрос - что происходит здесь? Почему клетки отображаются так медленно?
ОБНОВЛЕНИЕ 1I '
мы создали очень простое демонстрационное приложение, которое иллюстрирует проблему, которую яЯ имею. Вот'источник - https://github.com/antstorm/UITableViewCellPerformanceProblem
Попробуйте добавить хотя бы скриншот ячеек, чтобы почувствовать проблемы с производительностью.
Также обратите внимание, что добавление строки напрямую ("Вставьте сейчас! Кнопка) не вызывает никакой медлительности.