До этого, я не знаю, почему, когда у меня reloadData
моего стола, это занимает очень много времени.Почему UITableView 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
Как мы видим, сетчатой начал и нетто-конец занимает очень Небольшое время.
Но 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]];
}
блок анимации используется для создания анимации, почему бы вы поместили там данные перезагрузки? Вероятно, медлительность - это то, что он пытается оживить все, переставляя ячейку? – Tj3n
@ Tj3n Хотя документ яблока, я знаю, что не могу поместить 'reloadData' в блок анимации, но почему, документы не объяснили больше. – aircraft
Просьба показать ваши методы UITableViewDataSource и ... Делегировать. Особенно cellForRowAtIndexPath. –