網(wǎng)站首頁 編程語言 正文
iOS開發(fā)TableView網(wǎng)絡(luò)請求及展示預(yù)加載實(shí)現(xiàn)示例_IOS
作者:宇宙無敵大強(qiáng)子 ? 更新時間: 2022-09-12 編程語言引言
2022.02.11更新:新增了最簡單、高效和最推薦的方法。
2020.05.25更新:對總結(jié)進(jìn)行了詳細(xì)的補(bǔ)充。
傳統(tǒng)的上拉加載更多
在iOS的開發(fā)過程中,如果用列表展示數(shù)據(jù),此時一般的邏輯為上拉加載更多數(shù)據(jù),配合MJRefresh就是在滑動到最底部時,觸發(fā)加載更多的網(wǎng)絡(luò)請求。
滑動過程中預(yù)加載
如果希望體驗(yàn)好一點(diǎn),那么可以在滑動的過程中,加入一個預(yù)加載機(jī)制,具體的做法如下:
方法1(最簡單、高效和最推薦):
使用MJRefresh
的特性(MJ大神已經(jīng)替我們封裝好了,但是大多數(shù)人都不知道),在設(shè)置TableVIew的MJRefreshAutoFooter
時,triggerAutomaticallyRefreshPercent
這個屬性默認(rèn)是1,我們來看看源代碼中是怎么說的:
此時我們只需要一行代碼:
MJRefreshAutoFooter *footer = [MJRefreshAutoFooter footerWithRefreshingTarget:weakSelf refreshingAction:@selector(loadMore)]; footer.triggerAutomaticallyRefreshPercent = -20; //關(guān)鍵的一行代碼 self.tableView.mj_footer = footer;
將這個屬性設(shè)置為一個負(fù)數(shù),意思就是當(dāng)控件的底部出現(xiàn)-20時就自動刷新,很明顯,-20的距離就代表還沒有滑動到底部,就觸發(fā)了刷新了,這樣便完成了我們的預(yù)加載的需求。
方法2(自己計算實(shí)現(xiàn),不推薦了):
下滑(上拉)過程中,對當(dāng)前scrollView(tableView)的剩余可滑動距離(總滑動距離占可滑動距離的)比例進(jìn)行判斷,如果小于(大于)某個設(shè)定值,那么就觸發(fā)網(wǎng)絡(luò)請求(加載更多數(shù)據(jù))。
- 這樣做的好處顯而易見,用戶不必再去多做一個上拉加載更多數(shù)據(jù)的操作了,如果我們需要展示的數(shù)據(jù)量非常大的話,那么此種加載方式可以節(jié)省用戶大量的操作時間,大大提升了用戶的使用體驗(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ò)請求的類中添加一個Bool屬性,用來判定當(dāng)前是否正在進(jìn)行網(wǎng)絡(luò)請求;
@property (nonatomic, assign) BOOL isLoadingDataBool; //是否正在請求數(shù)據(jù)
2.在scrollView的滑動代理方法中,處理預(yù)加載機(jī)制的邏輯
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (self.tableview.mj_footer.state == MJRefreshStateNoMoreData) { // 沒有更多數(shù)據(jù),直接返回 return; } // 預(yù)加載的計算邏輯,當(dāng)滑動距離>80%目前剩余可滑動距離的時候,觸發(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)前滑動距離 CGFloat total = scrollView.contentSize.height; //總的可滑動距離 CGFloat ratio = current / total; if (ratio >= threshold) { //滑動距離超過比例值 [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é)
這個預(yù)加載其實(shí)不難,但是有幾個細(xì)節(jié)的地方需要處理好:
1.第二步scrollView的代理方法中計算當(dāng)前滑動時,一定要判斷當(dāng)前的contenntSize是否等于scrollView的高度,如果等于的話證明scrollView是剛剛開始滑動,還沒有過一屏的距離,此時在計算當(dāng)前滑動的距離時,就不能加上scrollView的高度;
2.當(dāng)滑動的比例值超出我們設(shè)定值的時候,移動要先發(fā)起網(wǎng)絡(luò)請求,再設(shè)置正在網(wǎng)絡(luò)請求的狀態(tài)為YES,因?yàn)樵诰W(wǎng)絡(luò)請求中會對該狀態(tài)進(jìn)行判斷,如果為YES的話直接就return了;
3.在網(wǎng)絡(luò)請求的完成回調(diào)中,別忘記了將正在網(wǎng)絡(luò)請求的狀態(tài)改回為NO。
原文鏈接:https://www.jianshu.com/p/782ef1dc3e89
相關(guān)推薦
- 2023-07-14 css :如何讓背景平鋪整個頁面
- 2022-02-22 Uncaught TypeError: Cannot read properties of unde
- 2022-05-27 react使用axios進(jìn)行api網(wǎng)絡(luò)請求的封裝方法詳解_React
- 2022-08-18 .Net中的弱引用字典WeakDictionary和ConditionalWeakTable介紹_實(shí)
- 2022-04-20 Flutter如何輕松實(shí)現(xiàn)動態(tài)更新ListView淺析_Android
- 2023-04-26 C++變量初始化形式及其默認(rèn)初始值問題_C 語言
- 2022-07-07 Python如何在列表尾部添加元素_python
- 2022-07-03 C#入門之結(jié)構(gòu)類型Struct_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支