关于tableView上拉加载更多时,调用多次请求的问题

处理上拉加载更多时调用多次请求的问题

最近被测试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];
}
复制代码

我用了这个方法来处理,测试也没问题,只是还是没太明白这是什么问题造成的,更好的解决方法是什么?有了解的可以多多指教讨论下~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值