iOS关于MJRefresh下拉刷新奇葩崩溃问题及解决办法

出现问题

第一种:在开始进入tableview的时候,调用一个网络请求方法,请求数据,然后数据加载正常,但是一但下拉刷新,就会崩溃,提示数组越界,但是下拉刷新的方法里无非就是重新调用下网络请求数据的方法,跟第一次进入tableview时请求数据的方法是一样的,为什么会崩溃呢?并且崩溃的地方还是在刚刚链接服务器的时候,都不是把数据请求下来装在数组之后,相当无语!

第二种:下拉距离短刷新没事,下拉距离长就会崩溃;

第三种:随机出现下拉刷新崩溃的;

问题解析

下拉刷新逻辑应该是这样的:

1 . 下拉

2 . 达到下拉临界值以后再请求网络数据

3 . 待数据加载到本地以后才更新 data source

4 . reload tableview

PS:如果先清空再下拉,后果就是往下拉的距离超过一个 cell 的高度时,table view 的几个委托方法就会被调用,由于 data source 已经被清空,造成错误的内存访问(包括数组越界,访问已销毁的对象)导致 crash;

解决办法

当下拉tableview时,当超过一定距离时,最下方的cell肯定会超出tableview显示范围,然后在下拉弹回时,会调用- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath ;

方法一:

如果在下拉动作中将arr清空,那么在tableview弹回调用此方法时,cell需要从arr中取值,此时会崩溃。前面有朋友说下拉距离短不回崩溃,距离长会崩溃,就是由这个问题引起的。所以才需要在request finished中才清空数组重新赋值,而不是下拉动作中清空。

方法二:

最简单暴力的方式就是: 在下拉刷新block中清空数据,立马reloadData;发送请求赋值完,再次relatedData 。当然这么做讲道理不符合逻辑,但是简单 !

目前collectionView也遇到过该情况,解决方法同样适用;

你可能感兴趣的:(iOS关于MJRefresh下拉刷新奇葩崩溃问题及解决办法)