Почему UITableView reloadData не может быть в анимированном блоке?

Раньше я не знаю, почему, когда я reloadData смотрю на стол, это занимает очень много времени.

введите описание изображения здесь

У меня есть тест Log, который нужно доказать, он показывает, что медленная работа не связана с тем, что сеть:

2016-12-29 14:50:20.958 Eee[1572:25220] lml-info-vc-test-net-began
2016-12-29 14:50:20.958 Eee[1572:25220] lml-info-vc-test-net-end
2016-12-29 14:50:20.972 Eee[1572:25220] lml-info-vc-test-net-animations-reloadData-bigin
2016-12-29 14:50:34.870 Eee[1572:25220] lml-info-vc-test-net-animations-reloadData-end

Как мы видим, net-begin и net-end занимают очень мало времени.
Но reloadData-bigin и reloadData-end занимает много времени, поэтому я поискал SO, что сделал reloadData? Я хочу знать глубоко, а не простой ответ, я всегда искал простой ответ, а не анализировать подробно.

Мой reloadData код:

//[self.pre_tableView reloadData];
[UIView animateWithDuration:0 animations:^{

     NSLog(@"lml-info-vc-test-net-animations-reloadData-bigin");

     [self.pre_tableView reloadData];
     NSLog(@"lml-info-vc-test-net-animations-reloadData-end");
 } completion:^(BOOL finished) {
     //Do something after that...
     [_pre_tableView.mj_footer endRefreshing];
     [_pre_tableView.mj_header endRefreshing];

 }];

Я использую блок анимации, а в completionHadler завершаю обновление.

Я также искал в docs для reloadData,

В Обсуждении:

Вызовите этот метод, чтобы перезагрузить все данные, которые используются для построения таблицы, включая ячейки, верхние и нижние колонтитулы разделов, массивы индексов и т. Д. Для эффективности в табличном представлении повторно отображаются только те строки, которые видны. Он корректирует смещения, если таблица сжимается в результате перезагрузки. Делегат табличного представления или источник данных вызывает этот метод, когда он хочет, чтобы табличное представление полностью перезагрузило свои данные. Его не следует вызывать в методах, которые вставляют или удаляют строки, особенно в блоке анимации, реализованном с помощью вызовов beginUpdates и endUpdates.

Внимание

С внимательным предложением:

Его не следует вызывать в методах, которые вставляют или удаляют строки, особенно в блоке анимации.

Что ж! Это означает, что я не должен использовать метод UIView animateWithDuration в reloadData, поэтому я заменяю свой код следующим образом:

[self.pre_tableView reloadData];
[_pre_tableView.mj_footer endRefreshing];
[_pre_tableView.mj_header endRefreshing];

Теперь это уже не медленно. Очень доволен, я нашел причину.

Но я просто хочу знать, почему, почему нельзя поместить метод reloadData в блок анимации?

И это reloadData не вышло из строя, даже занимает много времени, в блоке анимации что происходит? Значит, здесь столько времени?


Изменить -1

Мой дополнительный код ниже:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return self.pre_dataSource.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:info_TableIdentifier];

    if (cell == nil) {

        cell = [[LMLAgricultureTechCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:info_TableIdentifier];
    }
    //NSLog(@"lml-info-vc-test-cellSetModel-began");
    ((LMLAgricultureTechCell *)cell).model = self.pre_dataSource[indexPath.row];
    //NSLog(@"lml-info-vc-test-cellSetModel-end");
    ((LMLAgricultureTechCell *)cell).indexPath = indexPath;
    ((LMLAgricultureTechCell *)cell).delegate = self;
    ((LMLAgricultureTechCell *)cell).photo_view.delegate = self;

    return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // >>>>>>>>>>>>>>>>>>>>> * cell自适应 * >>>>>>>>>>>>>>>>>>>>>>>>
    id model;

    model = self.pre_dataSource[indexPath.row];

    return [self.pre_tableView cellHeightForIndexPath:indexPath model:model keyPath:@"model" cellClass:[LMLAgricultureTechCell class] contentViewWidth:[self cellContentViewWith]];
}

person aircraft    schedule 29.12.2016    source источник
comment
Блок анимации используется для создания анимации, зачем вам помещать туда данные перезагрузки? Возможно, медлительность связана с тем, что он пытается все анимировать при повторном рендеринге ячейки?   -  person Tj3n    schedule 29.12.2016
comment
@ Tj3n, хоть и яблочный документ, я знаю, что не могу поместить reloadData в блок анимации, но почему, в документах больше не объяснили.   -  person aircraft    schedule 29.12.2016
comment
Пожалуйста, покажите свои методы UITableViewDataSource и ... Delegate. Особенно cellForRowAtIndexPath.   -  person Hermann Klecker    schedule 29.12.2016
comment
Вы знаете, что не можете поместить reloadData в блок анимации, поэтому подчиняйтесь ему.   -  person GeneCode    schedule 29.12.2016


Ответы (1)


UIView.animateWithDuration... методы могут анимировать только animatable значения. Хотя иногда это кажется волшебством - на самом деле это не так ... reloadData - это асинхронный метод, который не может быть обработан блоком animate анимации.

Если вы хотите анимировать переход, вы можете использовать insert/delete/moveRows или использовать _6 _ метод UIView. Этот метод будет полностью отображать представление за пределами экрана, поскольку он будет следить за всеми изменениями, внесенными в его блок, а не анимировать переход между текущим состоянием представления и вновь визуализированным представлением. Сама анимация зависит от поставляемых вами опций, и вы, вероятно, захотите использовать UIViewAnimationOptionsTransitionCrossDissolve.

[UIView transitionWithView:self.pre_tableView 
              duration:0.3 
               options:UIViewAnimationOptionsTransitionCrossDissolve 
            animations: ^{ 
                [self.pre_tableView reloadData];
            } completion: ^(BOOL finished) { 
                ... 
            }];
person Aviel Gross    schedule 29.12.2016
comment
Кросс, как вы говорите, reloadData - это асинхронный метод, который не может быть обработан анимированным блоком, который будет анимирован, но он перезагружается, даже если он занимает много времени, он перезагружается успешно, но занимает много времени. Почему это занимает много времени? а не потерпел неудачу. - person aircraft; 29.12.2016