之前我不知道为什么,当我调用 reloadData
方法时,我的tableView会花费很长时间。
我进行了测试并记录了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-began和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];
}];
我使用动画块,并在
completionHandler
中结束刷新。我还查看了苹果的文档,关于 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
,但是为什么呢?文档没有做更多的解释。 - aircraft