今天测试提出一个bug,说在列表页下拉刷新的时候,同时请求了两次接口,一次pageNum=1,一次pageNum=2,并且调用顺序有时候pageNum=1在前,有时候pageNum=2在前,偶尔出现这种情况,就去排查了一下代码:
这是我统一封装的BaseViewController里面设置下拉加载上拉刷新的方法:
/// 设置页面上拉加载下拉刷新
/// @param VC 页面控制器
/// @param tableView 表视图
/// @param method 刷新或加载数据方法
/// @param trigger 提前加载百分比
- (void)setupMJRefreshWithVC:(RRBaseViewController *)VC tableView:(RRBaseTableView *)tableView method:(SEL)method trigger:(CGFloat)trigger {
MJRefreshNormalHeader *header = [[MJRefreshNormalHeader alloc] init];
[header setRefreshingBlock:^{
VC.pageNumber = 1;
VC.totalPages = 1;
if ([VC respondsToSelector:method]) {
((void (*)(id, SEL))[VC methodForSelector:method])(VC, method);
}
}];
tableView.mj_header = header;
MJRefreshAutoNormalFooter *footer = [[MJRefreshAutoNormalFooter alloc] init];
footer.triggerAutomaticallyRefreshPercent = trigger;
@WEAKOBJ(footer);
[footer setRefreshingBlock:^{
@STRONGOBJ(footer);
if (VC.pageNumber < VC.totalPages) {
VC.pageNumber += 1;
if ([VC respondsToSelector:method]) {
((void (*)(id, SEL))[VC methodForSelector:method])(VC, method);
}
} else {
[footer endRefreshingWithNoMoreData];
}
}];
tableView.mj_footer = footer;
}
发现footer有一个triggerAutomaticallyRefreshPercent属性,用来在页面未触底之前做提前刷新用的,我平时设置的值是-20.f,排查过程中发现当设置值小于0时,会偶尔出现上述问题,值越小,出现上述问题的几率就越大,于是去github看有木有遇到同样问题的,发现了一个pull request
,解决了我的问题,感谢作者!
解决方案:
在下述文件新增一行就可以了
/// MJRefreshAutoFooter.m
- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change
{
[super scrollViewContentOffsetDidChange:change];
if (self.state != MJRefreshStateIdle || !self.automaticallyRefresh || self.mj_y == 0) return;
if (_scrollView.mj_insetT + _scrollView.mj_contentH > _scrollView.mj_h) { // 内容超过一个屏幕
// 这里的_scrollView.mj_contentH替换掉self.mj_y更为合理
if (_scrollView.mj_offsetY >= _scrollView.mj_contentH - _scrollView.mj_h + self.mj_h * self.triggerAutomaticallyRefreshPercent + _scrollView.mj_insetB - self.mj_h) {
// 防止手松开时连续调用
CGPoint old = [change[@"old"] CGPointValue];
CGPoint new = [change[@"new"] CGPointValue];
if (new.y <= old.y) return;
/// MARK: 解决triggerAutomaticallyRefreshPercent设置小于0时引发header,footer同时刷新的问题
if (new.y <= 0) return;
/// end mark
// 当底部刷新控件完全出现时,才刷新
[self beginRefreshing];
}
}
}
网友评论