iOS tableView reloadData导致crash
2018-07-29 本文已影响0人
爱吃糖的葫芦娃
业务场景
1.最近发现线上crash率升高了很多。定位到app分类页面切换分类reloadData后tableView滚动到指定row会crash
2.购物车中点击加号请求逻辑后再次点击会获取不到正确的cell
crash信息
[UITableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:]: row (1) beyond bounds (0) for section (0).
发现切换分类后页面进行reloadData直接进行滚动到指定位置的section和row时候没有第一个row导致越界闪退
crash原因
reloadData代码执行后会调用tableview的数据源协议更新tableview。而我们在reloadData后面执行的滚动代码或者获取cell代码会立即执行。当我们数据量很大的时候,一个runloop周期还在执行,页面没有布局完成。导致reloadData后面的代码执行出现异常。等布局完成再去执行后续代码获取正确的cell或者滚动指定位置就可以正常了
解决方案
1.reloadData后面代码排队执行
[self.tableView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
//刷新完成,执行后续代码
});
2.强制重绘并等待完成
[self.tableView reloadData];
[self.tableView layoutIfNeeded];
//执行后续代码