处理上拉加载更多时调用多次请求的问题
最近被测试mm提了一个bug:
在进行列表数据的上拉加载更多操作时,有时会连续自己加载两次甚至多次接口请求!
最开始我是拒绝的,因为刷新加载控件是基于MJRefresh简单改造了点UI使用的,说MJRefresh会有这问题的话 我是不大相信的 毕竟太多人在用 有问题早该抛出来了。
但打开Charles 抓包走一遍,是真的出现这个问题了。懵逼的我开始看是什么原因造成的。
当上拉加载更多时 会一下子调用三四次请求接口方法,我猜想可能是因为这个界面的cell样式比较复杂的原因, 因为每个自定义cell的高度和样式都是动态布局显示的,以至于在需要加载更多时 导致新数据渲染的时候比较慢,所以出现上拉一下 相当于拉了三四次 就出现了这问题。
找资料大多都说这样:
对于tableview会跳动和多次调用block的最终原因是因为ios11 开始 tableview默认开启了self-sizing的原因。所以才会出现contentOffset的计算错误等。因此出现这些问题的tableview应该是都没有实现estimatedRowHeight这个属性吧。
由于ios11默认开启了,所以才会出现类似问题。 最简单的兼容方式 就是主动关闭self-sizing。
// 实现如下:
tableView.estimatedRowHeight = 0;
tableView.estimatedSectionHeaderHeight = 0;
tableView.estimatedSectionFooterHeight = 0;
复制代码
有的说这样就可以解决,虽然牺牲了UITableViewAutomaticDimension自动布局,可以用手动计算高度并缓存的方式来计算高度。 可以参考:说说tableViewCell行高计算。
但是我关闭了self-sizing,自测了一下,发现还是一样出现加载多次请求的问题,而且觉得关闭self-sizing也不太合适。
就想了个解决方法:
在加载更多方法里, 做个1.5s的延迟处理,在这时间段内 多次请求无效。
// 上拉加载更多, 在里面做延迟处理,解决渲染慢时 一次加载过多的问题
- (void)loadMoreData {
[[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(loadMoreDataValid) object:nil];
[self performSelector:@selector(loadMoreDataValid) withObject:nil afterDelay:1.5f];
}
// 有效加载更多的方法
- (void)loadMoreDataValid {
self.pageIndex ++;
[self loadRelativeDoctorDataWithPageIndex:self.pageIndex];
[self.tableView.mj_footer endRefreshing];
}
复制代码
我用了这个方法来处理,测试也没问题,只是还是没太明白这是什么问题造成的,更好的解决方法是什么?有了解的可以多多指教讨论下~