前言: 在使用刷新控件的时候, 我们经常会遇到一些比较棘手的问题. 比如, 在网络状况不佳的时候, 用户既下拉刷新, 又上拉加载, 会遇到异步加载数据,返回顺序的先后问题. 如果我们后台的接口只提供通过请求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的时候, 只需要处理最后一次的数据, 即可! 其它数据应该被忽略.