AFN和MBProgressHUD組合封裝


  從事ios開發也有一段時間了,早就有開通博客的想法,但因總感覺沒啥有技術含量的ideas,一再拖延。秉着丑媳婦也得見公婆的觀念,趁着2015年的最后一天開通微博,於新年第一天正式開啟偶的博客之路,歡迎各位拍磚指正,共同進步。

     app開發時網絡請求很常見,但是網絡不可控。在網絡數據未返回之前有必要給用戶點提示,告訴用戶app仍在工作中而不要讓其傻等,我所認知的網絡狀態提示方法如下:

  1、​所有控制器繼承自一個基類,在基類中創建一個遮住整個視圖的蒙版,蒙版上添加一個轉圈控件,頭文件暴露一個show和一個hidden方法供子類網絡請求時調用。

  2、直接使用三方框架MBProgressHUD或SVProgressHUD,每次網絡請求時創建一個HUD添加到視圖,網絡請求完畢則銷毀。

     在公司項目開發中,這兩種方法用着總是感覺有點淡淡地憂傷,網絡很好時每當進入一個界面總會出現一閃而過的HUD,個人感覺很是老火,也影響用戶體驗,於是希望有一種方式能在網絡狀況優良時不彈出提示框,網絡差時才讓其出現。

    早些日子詳細看了下​MBProgressHUD源碼發現其中就自帶這個小功能,於是將其與AFN框架一起封裝在一塊,經過公司項目驗證,工作正常,現在對其進行簡單分析:

  項目結構如下,是對AFN和MBProgressHUD的一個組合封裝,實現能根據網絡狀況自由調節HUD的出現與否。
 
 
 

  在網絡工具類NetworkTool.h中定義了一個枚舉,能選擇網絡提示框出現的合適時機,舉個例子,若網絡數據在0.7s之后返回,則依次選擇如下枚舉的實現效果是:0.5秒后出現HUD共計0.2s、不出現HUD、0.1s后出現HUD共計0.6s、不出現HUD、出現HUD共計0.7s​

  網絡提示框出現時機枚舉

 

主要實現方法如下:

   目標POST方法,GET方法實現基本一樣

​  方法實現很大眾,通俗易懂,這里需要稍微介紹下的是其中的兩個子方法。

1、網絡請求操作管理器manager的創建:

  ​AFN中默認的請求序列化器是HTTP類型,默認設置了請求頭Content-Type為application/x-www-form-urlencoded。JSON類型時默認設置請求頭Content-Type為application/json。

  就我自己公司而言,當服務器要求設置請求頭Content-Type為application/x-www-form-urlencoded,可知請求序列化器為HTTP類型, Content-Type為application/json時請求序列化器為JSON類型。

  響應序列化器默認為JSON類型,一般公司都是這種,但當訪問網頁等時有時需要設置響應序列化器為HTTP類型,如示例程序。

2、轉圈控件HUD的創建:

  先是根據枚舉設置graceTime時間,再是創建一個hud添加到窗口上,很簡單。這里必須要設置屬性taskInProgress為YES,並且在網絡請求成功或失敗后設置為NO,graceTime屬性的設置才會生效,具體后面分析。

  需要注意,​下面方法並不是馬上將hud顯示到窗口之上,具體后面分析。

  下面把目光集中到hud的創建方法上,​

  我公司一個中小型項目,目前的網絡請求有近兩百個,每次請求都創建一個HUD再銷毀顯然沒這個必要,運用動態綁定技術將hud和該類綁定,在程序運行過程中當且創建一個hud,避免頻繁創建\銷毀對象。

​  現在分析graceTime和taskInProgress組合實現延遲加載HUD原理。從方法[hud show:YES]入手。點進MBProgressHUD框架查看到該方法實現:

  意思就是假若設置了graceTime,則開啟定時器,在graceTime的時間之后再調用方法handleGraceTimer:方法,如下

  此時若taskInProgress屬性仍舊為YES才畫出HUD顯示到窗口上,否則不顯示。很明顯,若此時網絡請求已經返回,則taskInProgress屬性已經被設置為NO,再來到此方法時HUD不會顯示,反之才會顯示。

  最后,工具​中還提供了一個判斷是否有網的方法,+ (BOOL)hasNetworkReachability,可以將其添加到每個網絡請求發起之前,若存在網絡才發起請求,否則提示沒有網絡。

  最近看到一個話覺得很有意思,貌似是位大神的座右銘,拿來主義直接用下:

                                       Talk is cheap, Show me the code.

github代碼地址:https://github.com/zhangmaliang/SimpleNetwork

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM