前提:(UITableView和UICollectionView等列表控制器刷新),使用MJRefresh第三方框架
A.首先,我们来先理清逻辑:
- 下拉动作;
- 达到下拉临界值之后,再请求网络数据;
- 待数据加载完成拿到本地以后,才去更新 data source(数据源);
B.测试:
1.先小幅度下拉刷新,正常
2.大幅度下拉刷新,偶尔出现奔溃,App闪退,打印提示:"index 5 beyond bounds for empty array"之类
C.原因:
当下拉tableview时,当超过一定距离时,最下方的cell肯定会超出tableview显示范围,然后在下拉弹回时,会调用- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法。
如果在下拉动作中将arr清空,那么在tableview弹回调用此方法时,cell需要从arr中取值,此时会崩溃。
所以有人说下拉距离短不会崩溃,距离长会崩溃,就是由这个问题引起的。所以才需要在request finished中才清空数组重新赋值,而不是下拉动作中清空。
D.解决:
1.最简单暴力的方式就是:清空数据,立马reloadData (不推介)
2.网络请求成功之后再清空数据源,然后再给数据源赋值,再去reload.