2016-12-29 9 views
3

До этого, я не знаю, почему, когда у меня reloadData моего стола, это занимает очень много времени.Почему UITableView reloadData не может в анимационном блоке?

enter image description here

У меня есть тест 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 

Как мы видим, сетчатой ​​начал и нетто-конец занимает очень Небольшое время.
Но 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 for reloadData

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

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

Внимание

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

Он не должен вызываться в методах, вставлять и удалять строки, особенно в анимации блока

Ну ! Это означает, что я не должен в animateWithDuration методе мои UIView «ы к 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]]; 
} 
+0

блок анимации используется для создания анимации, почему бы вы поместили там данные перезагрузки? Вероятно, медлительность - это то, что он пытается оживить все, переставляя ячейку? – Tj3n

+0

@ Tj3n Хотя документ яблока, я знаю, что не могу поместить 'reloadData' в блок анимации, но почему, документы не объяснили больше. – aircraft

+0

Просьба показать ваши методы UITableViewDataSource и ... Делегировать. Особенно cellForRowAtIndexPath. –

ответ

1

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

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

[UIView transitionWithView:self.pre_tableView 
       duration:0.3 
       options:UIViewAnimationOptionsTransitionCrossDissolve 
      animations: ^{ 
       [self.pre_tableView reloadData]; 
      } completion: ^(BOOL finished) { 
       ... 
      }]; 
+0

Крест, как вы говорите, «reloadData - это асинхронный метод, который нельзя обработать анимированным блоком анимации», но он перезагружен даже занимает много времени, он перезагружает успех, но занимает много времени. много времени? а не потерпел неудачу. – aircraft