關於使用刷新控件的思考

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

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