iOS開發(fā)TableView網(wǎng)絡(luò)請求及展示預(yù)加載實(shí)現(xiàn)示例
引言
2022.02.11更新:新增了最簡單、高效和最推薦的方法。
2020.05.25更新:對總結(jié)進(jìn)行了詳細(xì)的補(bǔ)充。
傳統(tǒng)的上拉加載更多
在iOS的開發(fā)過程中,如果用列表展示數(shù)據(jù),此時(shí)一般的邏輯為上拉加載更多數(shù)據(jù),配合MJRefresh就是在滑動(dòng)到最底部時(shí),觸發(fā)加載更多的網(wǎng)絡(luò)請求。
滑動(dòng)過程中預(yù)加載
如果希望體驗(yàn)好一點(diǎn),那么可以在滑動(dòng)的過程中,加入一個(gè)預(yù)加載機(jī)制,具體的做法如下:
方法1(最簡單、高效和最推薦):
使用MJRefresh
的特性(MJ大神已經(jīng)替我們封裝好了,但是大多數(shù)人都不知道),在設(shè)置TableVIew的MJRefreshAutoFooter
時(shí),triggerAutomaticallyRefreshPercent
這個(gè)屬性默認(rèn)是1,我們來看看源代碼中是怎么說的:
此時(shí)我們只需要一行代碼:
MJRefreshAutoFooter *footer = [MJRefreshAutoFooter footerWithRefreshingTarget:weakSelf refreshingAction:@selector(loadMore)]; footer.triggerAutomaticallyRefreshPercent = -20; //關(guān)鍵的一行代碼 self.tableView.mj_footer = footer;
將這個(gè)屬性設(shè)置為一個(gè)負(fù)數(shù),意思就是當(dāng)控件的底部出現(xiàn)-20時(shí)就自動(dòng)刷新,很明顯,-20的距離就代表還沒有滑動(dòng)到底部,就觸發(fā)了刷新了,這樣便完成了我們的預(yù)加載的需求。
方法2(自己計(jì)算實(shí)現(xiàn),不推薦了):
下滑(上拉)過程中,對當(dāng)前scrollView(tableView)的剩余可滑動(dòng)距離(總滑動(dòng)距離占可滑動(dòng)距離的)比例進(jìn)行判斷,如果小于(大于)某個(gè)設(shè)定值,那么就觸發(fā)網(wǎng)絡(luò)請求(加載更多數(shù)據(jù))。
- 這樣做的好處顯而易見,用戶不必再去多做一個(gè)上拉加載更多數(shù)據(jù)的操作了,如果我們需要展示的數(shù)據(jù)量非常大的話,那么此種加載方式可以節(jié)省用戶大量的操作時(shí)間,大大提升了用戶的使用體驗(yàn)。
下面是具體實(shí)現(xiàn)細(xì)節(jié)(此細(xì)節(jié)是針對上述方法2的)
方法2是作者之前自己研究出來的,但是后來發(fā)現(xiàn)MJ已經(jīng)為我們實(shí)現(xiàn)了這么好的方法,就用不到了。有興趣的同學(xué)可以看看方法2的具體實(shí)現(xiàn):
1.我們需要在實(shí)現(xiàn)網(wǎng)絡(luò)請求的類中添加一個(gè)Bool屬性,用來判定當(dāng)前是否正在進(jìn)行網(wǎng)絡(luò)請求;
@property (nonatomic, assign) BOOL isLoadingDataBool; //是否正在請求數(shù)據(jù)
2.在scrollView的滑動(dòng)代理方法中,處理預(yù)加載機(jī)制的邏輯
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (self.tableview.mj_footer.state == MJRefreshStateNoMoreData) { // 沒有更多數(shù)據(jù),直接返回 return; } // 預(yù)加載的計(jì)算邏輯,當(dāng)滑動(dòng)距離>80%目前剩余可滑動(dòng)距離的時(shí)候,觸發(fā)預(yù)加載 CGFloat threshold = 0.8; //設(shè)定的比例值 CGFloat current = scrollView.contentOffset.y + ((scrollView.contentSize.height != scrollView.frame.size.height) ? scrollView.frame.size.height : 0); //當(dāng)前滑動(dòng)距離 CGFloat total = scrollView.contentSize.height; //總的可滑動(dòng)距離 CGFloat ratio = current / total; if (ratio >= threshold) { //滑動(dòng)距離超過比例值 [self requestDataList:NO showHUD:NO]; //發(fā)起加載更多網(wǎng)絡(luò)請求 self.isLoadingDataBool = YES; //設(shè)置正在網(wǎng)絡(luò)請求狀態(tài)為YES(一定要寫在請求之后) } }
3.處理網(wǎng)絡(luò)請求
/// 發(fā)起網(wǎng)絡(luò)請求 /// @param isReloadBool 是否為刷新請求 /// @param isShowHUDBool 是否加載指示器 - (void)requestDataList:(BOOL)isReloadBool showHUD:(BOOL)isShowHUDBool { if (self.isLoadingDataBool) { // 當(dāng)前正在請求,直接返回 return; } kWeakSelf(self); [DZCXHTTP requestWithResulted:^(BOOL isSuccessed, NSDictionary *dataDic, NSString *errorMsg) { kStrongSelf(self); strongself.isLoadingDataBool = NO; //請求完成,設(shè)置正在請求的狀態(tài)為NO }]; }
總結(jié)
這個(gè)預(yù)加載其實(shí)不難,但是有幾個(gè)細(xì)節(jié)的地方需要處理好:
1.第二步scrollView的代理方法中計(jì)算當(dāng)前滑動(dòng)時(shí),一定要判斷當(dāng)前的contenntSize是否等于scrollView的高度,如果等于的話證明scrollView是剛剛開始滑動(dòng),還沒有過一屏的距離,此時(shí)在計(jì)算當(dāng)前滑動(dòng)的距離時(shí),就不能加上scrollView的高度;
2.當(dāng)滑動(dòng)的比例值超出我們設(shè)定值的時(shí)候,移動(dòng)要先發(fā)起網(wǎng)絡(luò)請求,再設(shè)置正在網(wǎng)絡(luò)請求的狀態(tài)為YES,因?yàn)樵诰W(wǎng)絡(luò)請求中會(huì)對該狀態(tài)進(jìn)行判斷,如果為YES的話直接就return了;
3.在網(wǎng)絡(luò)請求的完成回調(diào)中,別忘記了將正在網(wǎng)絡(luò)請求的狀態(tài)改回為NO。
以上就是iOS開發(fā)TableView網(wǎng)絡(luò)請求及展示預(yù)加載實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于iOS TableView網(wǎng)絡(luò)請求預(yù)加載的資料請關(guān)注腳本之家其它相關(guān)文章!
- ios開發(fā)UITableViewCell圖片加載優(yōu)化詳解
- iOS ScrollView嵌套tableView聯(lián)動(dòng)滾動(dòng)的思路與最佳實(shí)踐
- iOS優(yōu)化UITableViewCell高度計(jì)算的一些事兒
- iOS自定義UITableView實(shí)現(xiàn)不同系統(tǒng)下的左滑刪除功能詳解
- iOS11解決UITableView側(cè)滑刪除無限拉伸的方法
- ios UITableView 自定義右滑刪除的實(shí)現(xiàn)代碼
- iOS開發(fā)學(xué)習(xí)TableView展現(xiàn)一個(gè)list實(shí)例
相關(guān)文章
iOS自定義View實(shí)現(xiàn)卡片滑動(dòng)
這篇文章主要為大家詳細(xì)介紹了ios自定義View實(shí)現(xiàn)卡片滑動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02淺談iOS 關(guān)于小數(shù)精確計(jì)算(NSDecimalNumber)
本篇文章主要介紹了淺談iOS 關(guān)于小數(shù)精確計(jì)算(NSDecimalNumber),具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08iOS開發(fā)中實(shí)現(xiàn)郵件和短信發(fā)送的簡單示例
這篇文章主要介紹了iOS開發(fā)中實(shí)現(xiàn)郵件和短信發(fā)送的簡單示例,編程語言依然是傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-09-09iOS 11 UINavigationItem 去除左右間隙的方法
本篇文章主要介紹了iOS 11 UINavigationItem 去除左右間隙的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10詳解iOS開發(fā)中Keychain的相關(guān)使用
這篇文章主要介紹了iOS開發(fā)中Keychain的相關(guān)使用,文中列舉了一個(gè)使用Keychain來保存密碼的例子,需要的朋友可以參考下2015-10-10iOS內(nèi)存管理中引用計(jì)數(shù)的學(xué)習(xí)
文章給大家分享了關(guān)于iOS內(nèi)存管理中引用計(jì)數(shù)的相關(guān)知識(shí)點(diǎn),對此有需要的朋友可以跟著學(xué)習(xí)下。2018-05-05將多個(gè)字符串高亮顯示之TTTAttributedLabel
本文介紹了將多個(gè)字符串高亮顯示之TTTAttributedLabel。在此需要對每個(gè)字符串進(jìn)行匹配,可以研究下kmp和bm算法,在這里應(yīng)用了oc自帶的NSRegularExpression 來進(jìn)行正則表達(dá)式匹配,算是比較簡單的方法,需要的朋友可以參考下2015-07-07