2020-03-13 MJRefresh使用过程中出现的问题

今天测试提出一个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];
        }
    }
}

你可能感兴趣的:(2020-03-13 MJRefresh使用过程中出现的问题)