Раньше я не знаю, почему, когда я 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]];
}
reloadData
в блок анимации, но почему, в документах больше не объяснили. - person aircraft   schedule 29.12.2016