前言: 在使用刷新控件的時候, 我們經常會遇到一些比較棘手的問題. 比如, 在網絡狀況不佳的時候, 用戶既下拉刷新, 又上拉加載, 會遇到異步加載數據,返回順序的先後問題. 如果我們後臺的接口只提供通過請求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的時候, 只需要處理最後一次的數據, 即可! 其它數據應該被忽略.