網(wǎng)絡(luò)請(qǐng)求、刷新、空白頁(yè)、提示語 邏輯分析

做頁(yè)面除了功能點(diǎn)的開發(fā),其他瑣碎的事情也會(huì)消耗了不少的腦力,比如,網(wǎng)絡(luò)請(qǐng)求的過程中獲取數(shù)據(jù)處理數(shù)據(jù)是我們喜歡做的事情,但是無網(wǎng)絡(luò)、需要登錄驗(yàn)證、請(qǐng)求成功沒數(shù)據(jù)、下拉刷新請(qǐng)求的數(shù)據(jù)、上拉分頁(yè)的數(shù)據(jù)、請(qǐng)求失敗...處理起來就比較消耗耐心了,雖然不難但是需要細(xì)心。整理一下,以備后面開發(fā)時(shí)捋順?biāo)悸?。封裝網(wǎng)絡(luò)請(qǐng)求方法不在本文討論范圍~

1,判斷網(wǎng)絡(luò)狀況

- (BOOL)requestListData:(BOOL)refresh {
    BOOL reachable = [TYDialogUtil isHasNetwork:NO];
    if (!reachable){ // 無網(wǎng)絡(luò)
        
        // 第一種情況
        return NO;

    }else{  // 網(wǎng)絡(luò)正常
        
        // 第二種情況
    }
}

在網(wǎng)絡(luò)請(qǐng)求之前,建議先判斷手機(jī)網(wǎng)絡(luò)狀態(tài),[TYDialogUtil isHasNetwork:NO];是我的項(xiàng)目中判斷無網(wǎng)絡(luò)的方法。你需要自己封裝方法,或者用你項(xiàng)目中已有的工具類方法進(jìn)行判斷~

  • 無網(wǎng)絡(luò)
    無網(wǎng)絡(luò)情況下需要給用戶進(jìn)行提示,一般提示分三類 (提示細(xì)節(jié)需進(jìn)一步與產(chǎn)品經(jīng)理溝通)
if (self.listArray.count>0) {
      //1, 提示 “沒有網(wǎng)絡(luò)連接,請(qǐng)稍后再試”
}else if (有緩存){
      //2, 提取緩存數(shù)據(jù),并給self.listArray賦值
      [mainTable_ reloadData]; //reload tableview 數(shù)據(jù)
}else{
      //3, 顯示無網(wǎng)絡(luò)空白頁(yè)
}

1,有歷史數(shù)據(jù)
self.listArray是存儲(chǔ)數(shù)據(jù)的全局變量, self.listArray.count>0 說明當(dāng)前頁(yè)面之前請(qǐng)求過數(shù)據(jù)存在,在有歷史數(shù)據(jù)的情況下,給用戶tip提示或者彈框提示

如下圖:

tip提示
彈框 提示.png

2,有緩存數(shù)據(jù)
第二種情況其實(shí)包括 self.listArray.count == 0,但是還需要判斷是否有緩存,如果有,把讀取緩存獲取的數(shù)據(jù)賦值給全局變量self.listArray,(然后刷新tableview或者collectionView... 總之有數(shù)據(jù)了,正常支配數(shù)據(jù))

3, 顯示空白頁(yè)
沒有歷史數(shù)據(jù),也沒有緩存數(shù)據(jù)的情況下,為了避免整個(gè)頁(yè)面白茫茫一片,需要自定義一個(gè)空白頁(yè)添加到頁(yè)面上

如圖:

自定義空白頁(yè)提示
  • 有網(wǎng)絡(luò)
    如果有網(wǎng)絡(luò),不要忘記把自定義的空白頁(yè)隱藏,然后進(jìn)行網(wǎng)絡(luò)請(qǐng)求。
預(yù)判斷網(wǎng)絡(luò)狀況的整體邏輯流程:
- (BOOL)requestListData:(BOOL)refresh {
      BOOL reachable = [TYDialogUtil isHasNetwork:NO];
      if (!reachable){ // 無網(wǎng)絡(luò)
        
        if (self.listArray.count>0) {
              //1, 提示 “沒有網(wǎng)絡(luò)連接,請(qǐng)稍后再試”
        }else if (有緩存){
              //2, 提取緩存數(shù)據(jù),并給self.listArray賦值
              [mainTable_ reloadData]; // 有新數(shù)據(jù)后刷新列表
        }else{
              //3, 顯示無網(wǎng)絡(luò)空白頁(yè)
        }
      return NO;

      }else{  // 網(wǎng)絡(luò)正常
        
          // 隱藏空白頁(yè)
          // 網(wǎng)絡(luò)請(qǐng)求
      }
}

2,網(wǎng)絡(luò)請(qǐng)求

[TYHTTPManager GET:baseUrl parameters:parameters resultClass:[NSDictionary class] success:^(AFHTTPRequestOperation *operation, id responseObject) {        
      // 第三種情況
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
      // 第四種情況
}];

網(wǎng)絡(luò)請(qǐng)求有很多種方法,可以用原生方法,可以用第三方庫(kù),我自己是為了方便對(duì)第三方庫(kù)加了個(gè)外殼,簡(jiǎn)單封裝了一下。網(wǎng)絡(luò)具體內(nèi)容本文就不再深入了,繼續(xù)邏輯分析~ 網(wǎng)絡(luò)請(qǐng)求結(jié)果很明顯是兩種,success 和failure

2.1 網(wǎng)絡(luò)請(qǐng)求成功

網(wǎng)絡(luò)請(qǐng)求成功后,情況是最復(fù)雜的,接下來我們一個(gè)一個(gè)分析:

一般網(wǎng)絡(luò)請(qǐng)求返回的數(shù)據(jù)是json或者xml格式,用工具類分析解析數(shù)據(jù)后,進(jìn)行以下判斷:

 if (有數(shù)據(jù)){
    if (刷新) {                    
          // 第五種情況  對(duì)數(shù)據(jù)進(jìn)行緩存(可選)

          // 第六種情況  添加新數(shù)據(jù)
          // 第七種情況  刷新有數(shù)據(jù)提示 (為您更新了XX條新內(nèi)容)(可選)
               
     }else {//上拉
          // 第八種情況  對(duì)數(shù)據(jù)進(jìn)行緩存(可選)
     }
 else{//網(wǎng)絡(luò)請(qǐng)求無數(shù)據(jù)
      if (無歷史數(shù)據(jù)) {
           // 顯示自定義空白頁(yè)
      }else { //有歷史數(shù)據(jù)
           if (刷新) {
               // 刷新 (暫無更多新內(nèi)容)
            }else {//上拉
               //上來無數(shù)據(jù)提示 (已到末頁(yè)請(qǐng)返回閱讀)
            }
       }
  }

網(wǎng)絡(luò)請(qǐng)求成功后,有時(shí)候有數(shù)據(jù),很多時(shí)候也會(huì)是空數(shù)據(jù),

有數(shù)據(jù)的情況下

既然有數(shù)據(jù),就會(huì)考慮有沒有歷史數(shù)據(jù)?新數(shù)據(jù)的加入方式,加在原有數(shù)據(jù)之前,還是簡(jiǎn)單的把新數(shù)據(jù)add到舊數(shù)據(jù)的后面?要不要緩存?以下分析考慮這些數(shù)據(jù)的先后步驟:

  • 刷新邏輯分類:
    如果有緩存方面的需求,一般在刷新的時(shí)候把get的數(shù)據(jù)加入緩存,有的緩存需求,只要求第一次refresh的新數(shù)據(jù),有的要求緩存所有數(shù)據(jù),如果緩存全部數(shù)據(jù),不要忘記設(shè)置的緩存最大值,不過每個(gè)app、甚至每個(gè)頁(yè)面的刷新機(jī)制都不一樣,大同小異,沒有技術(shù)難點(diǎn),所以需要你具體問題具體分析了

因?yàn)槭窍吕⑿拢话憬ㄗh把get的最新數(shù)據(jù)加到最前面,這樣刷新之后用戶第一眼看到的是最新內(nèi)容,很少有加到后面的情況,

1,保留歷史數(shù)據(jù),在self.listArray數(shù)組index==0 的位置插入新數(shù)據(jù)
或 清除舊數(shù)據(jù),直接給self.listArray 賦新值
2,考慮是否將數(shù)據(jù)加入緩存
3,提示 “為您更新了XX條新內(nèi)容” ,可選,閱讀性質(zhì)的app需要,電商等app就不需要此類提示

  • 上拉分頁(yè)請(qǐng)求邏輯:

1,保留歷史數(shù)據(jù),self.listArray 直接add新數(shù)據(jù)
2,考慮緩存情況
3, pageindex ++
注:分頁(yè)請(qǐng)求,有一個(gè)點(diǎn)需要注意,就是pageindex的計(jì)算,如果上傳給服務(wù)器的參數(shù)有pageindex(第幾頁(yè),int類型,記得要在http請(qǐng)求方法外面初始化),需要在此 ++,如果不需要傳此參數(shù),那么你可以忽略這個(gè)細(xì)節(jié)

無數(shù)據(jù)的情況下

既然沒有數(shù)據(jù),就會(huì)涉及要怎么樣給用戶做提示,還有考慮要不要重復(fù)加載網(wǎng)絡(luò)請(qǐng)求方法,來重新獲取數(shù)據(jù)(要注意細(xì)節(jié),避免死循環(huán))
再看一下偽代碼:

//網(wǎng)絡(luò)請(qǐng)求無數(shù)據(jù)
if (無歷史數(shù)據(jù)) {
    // 顯示自定義空白頁(yè)
}else { //有歷史數(shù)據(jù)
    if (刷新) {
       // 提示 (暫無更多新內(nèi)容)
    }else {//上拉
       //上來無數(shù)據(jù)提示 (已到末頁(yè)請(qǐng)返回閱讀)
    }
}
  • 無歷史數(shù)據(jù)

顯示自定義空白頁(yè)(無歷史數(shù)據(jù)+無新數(shù)據(jù) 所以要顯示自定義空白頁(yè))

  • 有歷史數(shù)據(jù)

1,下拉刷新,
頂部tip提示,或者彈框提示 "暫無更多新內(nèi)容"
2,上拉加載,
一般在列表底部,或者彈框 提示 ("暫無更多新內(nèi)容"、“已經(jīng)拉到底了”、“已到末頁(yè)請(qǐng)返回閱讀”)

目前為止偽代碼邏輯:

[TYHTTPManager GET:baseUrl parameters:parameters resultClass:[NSDictionary class] success:^(AFHTTPRequestOperation *operation, id responseObject) {        
      // 第三種情況
      if (有數(shù)據(jù)){
          if (刷新) {                    
                // 第五種情況  對(duì)數(shù)據(jù)進(jìn)行緩存(可選)

                // 第六種情況  添加新數(shù)據(jù)
                // 第七種情況  刷新有數(shù)據(jù)提示 (為您更新了XX條新內(nèi)容)(可選)
               
           }else {//上拉
                // 第八種情況  對(duì)數(shù)據(jù)進(jìn)行緩存(可選)
           }
       else{//網(wǎng)絡(luò)請(qǐng)求無數(shù)據(jù)
            if (無歷史數(shù)據(jù)) {
                 // 顯示自定義空白頁(yè)
            }else { //有歷史數(shù)據(jù)
               if (刷新) {
                   // 刷新 (暫無更多新內(nèi)容)
               }else {//上拉
                   //上來無數(shù)據(jù)提示 (已到末頁(yè)請(qǐng)返回閱讀)
               }
             }
        }
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
      // 第四種情況
}];

2.2 網(wǎng)絡(luò)請(qǐng)求失敗

if (self.listArray.count>0) {
   // 提示 (網(wǎng)絡(luò)連接失敗,請(qǐng)稍后再試)
}else{
    // 顯示自定義空白頁(yè)
}

這部分提示與之前的雷同,就不贅述解釋了~

最后

總體邏輯偽代碼:
- (BOOL)requestListData:(BOOL)refresh {
      BOOL reachable = [TYDialogUtil isHasNetwork:NO];
      if (!reachable){ // 無網(wǎng)絡(luò)
        
        if (self.listArray.count>0) {
              //1, 提示 “沒有網(wǎng)絡(luò)連接,請(qǐng)稍后再試”
        }else if (有緩存){
              //2, 提取緩存數(shù)據(jù),并給self.listArray賦值
              [mainTable_ reloadData]; // 有新數(shù)據(jù)后刷新列表
        }else{
              //3, 顯示無網(wǎng)絡(luò)空白頁(yè)
        }
      return NO;

      }else{  // 網(wǎng)絡(luò)正常
        
          // 隱藏空白頁(yè)
          // 網(wǎng)絡(luò)請(qǐng)求
          
          [TYHTTPManager GET:baseUrl parameters:parameters resultClass:[NSDictionary class] success:^(AFHTTPRequestOperation *operation, id responseObject) {        
                // 第三種情況
                if (有數(shù)據(jù)){
                    if (刷新) {                    
                          // 第五種情況  對(duì)數(shù)據(jù)進(jìn)行緩存(可選)

                          // 第六種情況  添加新數(shù)據(jù)
                          // 第七種情況  刷新有數(shù)據(jù)提示 (為您更新了XX條新內(nèi)容)(可選)
               
                     }else {//上拉
                          // 第八種情況  對(duì)數(shù)據(jù)進(jìn)行緩存(可選)
                     }
                }else{//網(wǎng)絡(luò)請(qǐng)求無數(shù)據(jù)
                      if (無歷史數(shù)據(jù)) {
                           // 顯示自定義空白頁(yè)
                      }else { //有歷史數(shù)據(jù)
                          if (刷新) {
                              // 刷新 (暫無更多新內(nèi)容)
                          }else {//上拉
                             //上拉無數(shù)據(jù)提示 (已到末頁(yè)請(qǐng)返回閱讀)
                          }
                      }
                }
           } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                // 第四種情況
                if (self.listArray.count>0) {
                   // 提示 (網(wǎng)絡(luò)連接失敗,請(qǐng)稍后再試)
                }else{
                  // 顯示自定義空白頁(yè)
                }
          }];
      }
     return YES;
  }

以上是本人個(gè)人的邏輯,敬請(qǐng)參考~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • AFHTTPRequestOperationManager 網(wǎng)絡(luò)傳輸協(xié)議UDP、TCP、Http、Socket、X...
    Carden閱讀 5,320評(píng)論 0 12
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,021評(píng)論 25 709
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中。。。 其實(shí)如果沒有APIManager這一層是沒法使用delegate的,畢竟多個(gè)單...
    yhtang閱讀 5,490評(píng)論 1 23
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,262評(píng)論 4 61
  • 一個(gè)人的世界是末日,一群人的世界是末日,所以人的世界都是末日。對(duì)于自己的生活 人族不滿,不滿的不是自己的一生一世。...
    搶個(gè)媳婦去領(lǐng)證閱讀 284評(píng)論 1 2

友情鏈接更多精彩內(nèi)容