LXNetwork – 基於AF3.0封裝的iOS網路請求庫

發表於2016-09-07

本框架實現思路與YTKNetwork和RTNetworking類似,相當於一個簡單版,把每一個網路請求封裝成物件。使用LXNetwork,你的每一個請求都需要繼承LXBaseRequest類,通過覆蓋父類的一些方法或者實現相關協議方法來構造指定的網路請求。這個網路庫可直接在專案中使用,但是有些功能完成度不是很完美,待完善。
GitHud地址:https://github.com/CoderLXWang/LXNetwork


一、為什麼要這樣做?

實現思路的圖在下面,可以對比著圖看下面內容。
直接封裝一個簡易的HttpTool,裡面直接呼叫AF,返回responseObject直接返回, 這樣不行嗎, 為什麼要弄這麼麻煩?
顯而易見的優點大概有以下幾點:

1,前後隔離AFNetworking,以後如果升級AF或者替換其他框架, 只需要改動直接與AF接觸的LXRequestProxy和LXResponse內的程式碼即可,避免對專案中業務程式碼產生影響(半小時完成從AF2.6升級AF3.0,重度使用的三方框架一般都要隔離一下)

2,將每個介面抽象成一個類,易於管理,按每個介面的需求構造請求(比如有的介面要快取,有的介面不要快取)

3,所有介面呼叫都經過LXBaseRequest,可以方便的在基類中處理公共邏輯(比如專案全部完成了,突然要用請求引數排序,加鹽等方式加密)

缺點:使用麻煩。。。。。

112162015-d73291194e853b81

實現思路.png

二、思路講解
包括快取在內的大體思路即上圖,上圖中箭頭顏色由淺到深即為呼叫順序,大概講解一下

1,首先要把網路請求封裝成物件,即圖中TestApi(繼承於LXBaseRequest),在Viewcontroller中呼叫介面loadData

2,這時會呼叫到TestApi的父類LXBaseRequest中的loadData方法, 並從TestApi實現的重寫或者協議方法中獲取url, 請求型別, 引數等資訊, 呼叫LXRequestProxy中的請求方法

3, LXRequestProxy內部呼叫AF的GET或其他方法

4, 回撥之後並沒有直接返回responseObject,而是轉換成LXResponse,這樣返回的資料經過封裝, 相當於從後面也進行了隔離, 比如AF2.x的時候回撥block的引數還是^(AFHTTPRequestOperation *operation, id reponseObject),AF3.x就變成了^(NSURLSessionDataTask *task, id reponseObject),如果不轉換一下, 直接返回到控制器,改起來就尷尬了。。。

5,一路回撥到TestApi, 再到ViewController

6,走完之後再看一下快取如何處理,首先,快取一定分為存和取,
存,在第5步, 一路回撥到父類中的successCallApi這一步,將回撥資料存起來的(用GET+登入狀態或其他+url+引數轉換的字串作為key,這個隨意,適合專案即可)。
取,在第2步呼叫父類LXBaseRequest中的loadData時會先檢測該介面對應的資料是否存在, 存在直接返回父類LXBaseRequest中的successCallApi,不存在則正常發出請求


三, 舉個栗子

介面如何定義?
FirstTestApi.h

FirstTestApi.m

控制器中如何使用?
ViewController.h


四,還有那些功能及注意

1,如何清除快取, 比如在A介面的某個操作導致B,C介面資料都應發生變化, 這時切換到B,C介面(快取有效時間內,預設30秒,可在LXNetworkConfiguration中設定),如果還是使用快取就不對了。
方式1: 如果在需要清快取的時刻能獲取到BC介面相應介面, 可呼叫[B.firstApi deleteCache],介面父類LXBaseRequest的deleteCache方法即可清除快取
方式2: 一般情況下, 在A介面操作的時候可能已經獲取不到BC介面的介面了,這是可以通過通知清除,讓AppDelegate監聽清除快取的通知

A介面某個操作成功之後

2,如果一個介面內有多個api怎麼辦, 都在requestDidSuccess裡通過型別寫if else 很亂, 實現requestDicWithClassStrAndSELStr將回撥分發到單獨的方法中

3,如何使用block回撥,注意使用這種方式回撥不用遵守LXBaseRequestCallBackDelegate協議和設定self.secondApi.delegate = self

4,介面有動態加密的快取處理, 如果介面有加密, 並且融合了時間戳等,每次呼叫的簽名都不一致的話,由於快取的key拼接了引數, 如果把動態變化的簽名也拼進去就永遠找不到快取,那麼就需要修改以下程式碼, 將下面程式碼中註釋部分開啟, 在if條件中排除會動態變化的引數的key

NSDictionary+LXNetworkParams.m

5,其他功能用法見原始碼,有問題或者建議歡迎交流溝通


GitHud地址:https://github.com/CoderLXWang/LXNetwork

相關文章