关于使用刷新控件的思考

前言: 在使用刷新控件的时候, 我们经常会遇到一些比较棘手的问题. 比如, 在网络状况不佳的时候, 用户既下拉刷新, 又上拉加载, 会遇到异步加载数据,返回顺序的先后问题. 如果我们后台的接口只提供通过请求page参数来实现加载多页数据的情况下, 对页码的考虑, 就显得很重要了.

/**处理办法*/

//1.添加一个记录请求参数的属性, 用来保存上一次请求时的参数
@interface QMWordTableViewController ()
@property (nonatomic, assign) NSInteger currentPage; //当前页数
@property (nonatomic, strong) NSMutableDictionary *params;//请求参数

//2.在下拉加载最新数据的时候, 你需要做以下几个步骤:
- (void)loadNewTopics
{
    //*1.结束上拉
    [上拉加载控件 结束刷新];

    //参数
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"a"] = @"1";
    params[@"b"] = @"2";

    //*2.记录当前请求的参数, 保存起来   
    self.params = params;

    //发送请求
    [[AFHTTPSessionManager manager] GET:@"http://test.php" parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        //*3.如果本次请求的参数不等于现在储存的参数, 说明该次请求已经过时, 可忽略
        if (params != self.params) return;

        /**数据处理部分*/   

        [self.tableView reloadData];

        [下拉刷新控件 结束刷新];

        //*4.加载成功之后,再清空页码, 如果不成功, 不需要清空页码, 防止出现数据混乱
        self.currentPage = 0;

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        //*3.如果本次请求的参数不等于现在储存的参数, 说明该次请求已经过时, 可忽略
        if (params != self.params) return;

        [下拉刷新控件 结束刷新];
    }];
}

- (void)loadMoreTopics
{
    //*1.结束下拉
    [下拉刷新控件 结束刷新];

    //*2.设置当前页码
    self.currentPage += 1;

    //参数
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"a"] = @"1";
    params[@"b"] = @"2";

    //*3. 设置page参数
    params[@"page"] = @(self.currentPage);

    //*4.记录当前请求的参数, 保存起来   
    self.params = params;

    //发送请求
    [[AFHTTPSessionManager manager] GET:@"http://test.php" parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        //*5.如果本次请求的参数不等于现在储存的参数, 说明该次请求已经过时, 可忽略
        if (params != self.params) return;

        /**数据处理*/

        [self.tableView reloadData];

        [上拉加载控件 结束刷新];

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        //*5.如果本次请求的参数不等于现在储存的参数, 说明该次请求已经过时, 可忽略
        if (params != self.params) return;

        //*6.如果请求失败, 需要恢复页码, 注意*6和*5的顺序. 如果, 上拉加载后, 数据没有返回, 又下拉刷新, 下拉刷新的数据返回, currentPage置为0, 这时, 上拉加载的数据返回了, 如果顺序颠倒, 会造成currentPage变为 -1 !~ 
        self.currentPage -= 1;

        [上拉加载控件 结束刷新];
    }];
}
@end

尾记: 对刷新控件数据的处理, 遵循一点: 即用户多次进行上拉, 下拉操作, 在网络情况不佳的时候, 用户的期望是看到最后一次操作的数据. 因此, 在显示UI的时候, 只需要处理最后一次的数据, 即可! 其它数据应该被忽略.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章