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

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

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

Ответы на вопрос(5)

Ваш ответ на вопрос