欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS開發(fā)TableView網(wǎng)絡(luò)請求及展示預(yù)加載實(shí)現(xiàn)示例

 更新時(shí)間:2022年07月19日 16:12:07   作者:宇宙無敵大強(qiáng)子  
這篇文章主要為大家介紹了iOS開發(fā)TableView網(wǎng)絡(luò)請求及展示預(yù)加載實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jì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)文章!

相關(guān)文章

  • iOS自定義View實(shí)現(xiàn)卡片滑動(dòng)

    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)

    本篇文章主要介紹了淺談iOS 關(guān)于小數(shù)精確計(jì)算(NSDecimalNumber),具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • iOS中UIAlertView警告框組件的使用教程

    iOS中UIAlertView警告框組件的使用教程

    需要注意的是在IOS8之后,UIAlertView和UIActionSheet這兩個(gè)控件被UIAlertController代替,但是這兩個(gè)控件依然可以使,下面我們就簡單了解一下iOS中UIAlertView警告框組件的使用教程
    2016-05-05
  • iOS開發(fā)中實(shí)現(xiàn)郵件和短信發(fā)送的簡單示例

    iOS開發(fā)中實(shí)現(xiàn)郵件和短信發(fā)送的簡單示例

    這篇文章主要介紹了iOS開發(fā)中實(shí)現(xiàn)郵件和短信發(fā)送的簡單示例,編程語言依然是傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-09-09
  • iOS導(dǎo)航欄控制的一些總結(jié)

    iOS導(dǎo)航欄控制的一些總結(jié)

    這篇文章主要給大家介紹了關(guān)于iOS導(dǎo)航欄控制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • iOS 11 UINavigationItem 去除左右間隙的方法

    iOS 11 UINavigationItem 去除左右間隙的方法

    本篇文章主要介紹了iOS 11 UINavigationItem 去除左右間隙的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • 詳解iOS開發(fā)中Keychain的相關(guān)使用

    詳解iOS開發(fā)中Keychain的相關(guān)使用

    這篇文章主要介紹了iOS開發(fā)中Keychain的相關(guān)使用,文中列舉了一個(gè)使用Keychain來保存密碼的例子,需要的朋友可以參考下
    2015-10-10
  • iOS內(nèi)存管理中引用計(jì)數(shù)的學(xué)習(xí)

    iOS內(nèi)存管理中引用計(jì)數(shù)的學(xué)習(xí)

    文章給大家分享了關(guān)于iOS內(nèi)存管理中引用計(jì)數(shù)的相關(guān)知識(shí)點(diǎn),對此有需要的朋友可以跟著學(xué)習(xí)下。
    2018-05-05
  • iOS中解決Xcode 8控制臺(tái)亂碼的方式

    iOS中解決Xcode 8控制臺(tái)亂碼的方式

    這篇文章給大家介紹了iOS中解決Xcode 8控制臺(tái)亂碼的方式,文中給出了詳細(xì)解決步驟,相信對大家的理解和學(xué)習(xí)很有幫助,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • 將多個(gè)字符串高亮顯示之TTTAttributedLabel

    將多個(gè)字符串高亮顯示之TTTAttributedLabel

    本文介紹了將多個(gè)字符串高亮顯示之TTTAttributedLabel。在此需要對每個(gè)字符串進(jìn)行匹配,可以研究下kmp和bm算法,在這里應(yīng)用了oc自帶的NSRegularExpression 來進(jìn)行正則表達(dá)式匹配,算是比較簡單的方法,需要的朋友可以參考下
    2015-07-07

最新評論