Alamofire 使用心得

先說我們最基本的使用:

這是我們得到的response.result.value就是我們原始的數據

1、設置路由

我們有時候有這樣的需求,那就是根據不同的請求類型,我們組裝url或者參數的方式不一樣,而最終生成的request 不一樣,所以我們這個時候我們希望根據我們傳進去的type自動生成request。

request有一個對象方法,我們只需要定義生成request的方法,request對象會自己調用這個方法,生成request

這個地方的參數 urlRequest 是一個繼承URLRequestConvertible的數據,不一定要對象,只要繼承URLRequestConvertible 協議,實現了協議的asURLRequest 方法,這個方法就會自動被調用,生成request給請求使用,我們這兒有多種type,然后生成對應的request,所以我們使用枚舉比較合適 代碼如下

而我們調用的時候,只需要指明枚舉類型,給枚舉參數,就會自動生成request,代碼如下

我們給上面的操作給一個高大上的名字,設置路由。

2、 通過map 很簡單生成一個數組

先上代碼:

我們的需求是比如現在indexPath到了15,新來了5個數據,我們就需要 5個indexPath,section為0,index為16-20,按照我們常規的寫法,for一個循環,i從16到20,初始化5個indexPath,然后將這幾個indexPath放入一個數組。

這兒我們一句話解決,這種語法很好,我們要經常使用

3、定義方法,直接從原始數據中取出我們需要的數據(image、model)返回。

一般情況下服務端會返回一大段我們不需要的數據,我們要解析數據,等等,而且有時候我們需要整個數據中的image,有時候又需要另外一個model,所以這個時候我們希望有個方法可以根據我們的定義,直接在結果中返回我們需要的東西

我們先看下response拿到結果后的實現

我們分析下上面的代碼

第一個是request的方法,他會把我們的數據封裝到DataResponse里,結合第二張圖片我們可以知道,DataResponse后尖括號的泛型就是result的value,我們再看一張圖片

request的類方法serializeResponseData,返回的就是result,data就是我們原始得到的data,所以我們可以自定義類似于serializeResponseData這樣的方法,返回我們自己需要的數據類型。我們先自定義一個返回result的value為image類型的方法

返回值是DataResponseSerializer

他是繼承與協議DataResponseSerializerProtocol的,滿足于我們第一張圖片的要求。

所以執行下面方法后,我們的result的value就會是我們自己想要的類型了

當然我們需要用request去調用這個方法

這樣我們直接拿到的就是image了。

但是我們經常想要的是,傳進去一個model,出來就直接是這個model的數據,其實是一樣的道理。

改下上面的responseImage ,看下面的方法

區別在哪兒,我們先將response的data轉化為json數據拿出來,拿到json數據后,我們根據我們傳進來的類,實現一個初始化方法,參數就是我們的json數據,但是我們初始化方法需要我們自己在我們的model里面定義,那么多model,都是根據json數據定義的,所以我們可以讓我們所有的model實現一個相似的類方法,這兒就可以使用協議了。

上面是一個類實現的協議初始化方法,后面實現的是繼承協議,所以我們傳一個類名進去,在model里實現協議定義的初始化方法,就ok了,再看下怎么調用的

這樣我們拿出來的就直接是model了

但是我們有時候還想拿數組怎么辦,其實是一樣的區別只是在 協議的方法,我們不用對象方法了,直接用類方法,看代碼

區別就是,一個是根據json對象生成model的對象(類的初始化方法),一個是生成model的數組(類方法)。

我們再看下調用的地方

這個大概就說完了,總結下,好的地方在哪兒呢,還是在于協議的活用,它只是一個協議,我們只要滿足協議,可以定義任意數據類型,滿足我們的需求。

我們上面關鍵的點在,我們自定義request的類似于serializeResponseData 這樣的類方法,只要返回值滿足DataResponseSerializerProtocol 就行,而我們有一個結構體,他就是繼承與上面的protocol的,只要我們返回我們的結構體就行了,這個結構體就是DataResponseSerializer,所以我們要做的,就是構造這個結構體,然后返回這個結構體。這個結構體將作為

的第二個參數,調用上面的方法,就會將結果按照我們想要的形式返回了,而在哪兒返回的呢,在上面方法的第三個參數(closure)的DataResponse的result的value里面。

打完收工。

所以,總要的事情說三遍:(協議、繼承、泛型) * 3

參考資料:Alamofire 網絡庫使用基礎教程??Alamofire 網絡庫使用基礎教程

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容