bugs

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];
//执行后续代码

参考文章

http://mrpeak.cn/blog/tableview-danger/

上一篇下一篇

猜你喜欢

热点阅读