TableView列表加載時的頁碼管理問題

本文是寫給剛?cè)胄械男峦瑢W(xué)看界酒。

問題

在處理列表分頁時奇瘦,對于頁碼的管理很容易出bug蜂怎。一個常見的誤區(qū)是:在請求發(fā)起的同時對頁碼作了遞增操作楼吃,由此造成了如果請求過程中出現(xiàn)網(wǎng)絡(luò)異常演痒,或者無數(shù)據(jù)返回時亲轨,頁碼的這一次遞增就是無效的。

  • 如果不處理鸟顺,再次進行上拉加載時惦蚊,會繼續(xù)對頁碼遞增,此時會造成之前請求失敗的那一頁數(shù)據(jù)缺失讯嫂。
  • 如果說在發(fā)現(xiàn)請求異常時蹦锋,把頁碼減回去,會容易讓處理邏輯變得復(fù)雜欧芽,且一邊遞增一邊遞減莉掂,不可靠而且不推薦。
  • 比較好的做法是千扔,只有在成功取到我們希望的那一頁數(shù)據(jù)時憎妙,再把頁碼作遞增库正,始終讓頁碼是指向未來要加載的那一頁。

示例

這里借助MJRefresh為TableView添加了頂部刷新和底部刷新:

self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(onHeaderRefresh)];
self.tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(onFooterRefresh)];

無論是重新刷新還是加載更多厘唾,都不應(yīng)該知道頁碼的存在褥符,在它們的響應(yīng)方法角度看,只關(guān)心是否需要重置列表數(shù)據(jù)

/// 頂部刷新
- (void)onHeaderRefresh {
    [self requestServerDataReset:YES];
}

/// 底部加載更多
- (void)onFooterRefresh {
    [self requestServerDataReset:NO];
}

在數(shù)據(jù)請求方法里抚垃,統(tǒng)一管理頁碼喷楣。只有兩處對頁碼進行賦值,分別是重置列表時和成功取到一頁數(shù)據(jù)時:

- (void)requestServerDataReset:(BOOL)reset {
    if (reset) {
        self.page = 1;
    }
    self.title = [NSString stringWithFormat:@"正在請求第%@頁", @(self.page)];
    [self generateServerDataWithPage:self.page finish:^(NSMutableArray<NSString *> *data) {
        [self.tableView.mj_header endRefreshing];
        [self.tableView.mj_footer endRefreshing];
        
        if (reset) {
            [self.dataSource removeAllObjects];
        }
        
        if (data && data.count) {
            [self.dataSource addObjectsFromArray:data];
            self.title = [NSString stringWithFormat:@"第%@頁:成功返回%@條", @(self.page), @(data.count)];
            self.page ++;
        }
        else {
            self.title = [NSString stringWithFormat:@"第%@頁:請求失敗或無數(shù)據(jù)", @(self.page)];
        }
        [self.tableView reloadData];
    }];
}

另外是模擬服務(wù)響應(yīng)鹤树、返回數(shù)據(jù)的方法

/// 生成模擬數(shù)據(jù)铣焊,page從0開始
- (void)generateServerDataWithPage:(NSInteger)page finish:(void (^)(NSMutableArray<NSString *> *data))finish {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 模擬處理用時
        sleep(1);
        
        // 模擬網(wǎng)絡(luò)異常
        static NSInteger flag = 0;
        if (++flag % 2 == 0) {
            NSLog(@"網(wǎng)絡(luò)異常!");
            dispatch_async(dispatch_get_main_queue(), ^{
                finish(nil);
            });
            return;
        }
        
        // 正常返回數(shù)據(jù)
        NSInteger dataCount = 10;
        NSMutableArray *arr = [NSMutableArray array];
        for (NSInteger index = 1; index <= dataCount; index ++) {
            [arr addObject:[NSString stringWithFormat:@"第%@頁,第%@條", @(page), @(index)]];
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            finish(arr);
        });
    });
}
TableViewLoadMoreDemo
TableViewLoadMoreDemo

源碼:https://github.com/JiongXing/TableViewLoadMoreDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罕伯,一起剝皮案震驚了整個濱河市粗截,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捣炬,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绽榛,死亡現(xiàn)場離奇詭異湿酸,居然都是意外死亡,警方通過查閱死者的電腦和手機灭美,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門推溃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人届腐,你說我怎么就攤上這事铁坎。” “怎么了犁苏?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵硬萍,是天一觀的道長。 經(jīng)常有香客問我围详,道長朴乖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任助赞,我火速辦了婚禮买羞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雹食。我一直安慰自己畜普,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布群叶。 她就那樣靜靜地躺著吃挑,像睡著了一般钝荡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上儒鹿,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天化撕,我揣著相機與錄音,去河邊找鬼约炎。 笑死植阴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的圾浅。 我是一名探鬼主播掠手,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狸捕!你這毒婦竟也來了喷鸽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤灸拍,失蹤者是張志新(化名)和其女友劉穎做祝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸡岗,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡混槐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了轩性。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片声登。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖揣苏,靈堂內(nèi)的尸體忽然破棺而出悯嗓,到底是詐尸還是另有隱情,我是刑警寧澤卸察,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布脯厨,位于F島的核電站,受9級特大地震影響坑质,放射性物質(zhì)發(fā)生泄漏俄认。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一洪乍、第九天 我趴在偏房一處隱蔽的房頂上張望眯杏。 院中可真熱鬧,春花似錦壳澳、人聲如沸岂贩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萎津。三九已至卸伞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锉屈,已是汗流浹背荤傲。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留颈渊,地道東北人遂黍。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像俊嗽,于是被迫代替她去往敵國和親雾家。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案绍豁? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補...
    _Yfling閱讀 13,737評論 1 92
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中芯咧。。竹揍。 其實如果沒有APIManager這一層是沒法使用delegate的敬飒,畢竟多個單...
    yhtang閱讀 5,172評論 1 23
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,769評論 25 707
  • 最近在做項目時發(fā)現(xiàn)列表分頁加載數(shù)據(jù)體驗并不是很好,第一個想到解決此問題的方案就是預(yù)加載芬位,便在網(wǎng)上找了一些相關(guān)的資料...
    ControlM閱讀 2,490評論 0 4
  • 一直覺得馬云爸爸挺偉大晶衷,用支付寶建立了買賣雙方的信任。作為消費者阴孟,買東西時晌纫,是先把錢給第三方,貨真的到手了永丝,才把錢...
    我是萌小七閱讀 1,548評論 0 0