Alamofire設計之道

weixin_34253539發表於2018-09-04

1.初識

Swift編寫的iOS App的網路模組都是基於Alamofire。Alamofire就是建立在NSURLSession上的封裝。NSURLSession是在2013年推出的新API,並且Apple在2015年廢棄了NSURLConnection。如果你的App還在用以NSURLConnection建立的網路層(比如AFNetworking 2.x),那麼你真的應該考慮升級到NSURLSession(比如AFNetworking 3.x),廢棄的API也許還能正常工作,但是Apple已對其不再維護,當然也就不支援HTTP 2.0等新特性。

2.我們來對比一下,同樣GET一個URL,然後把資料解析成JSON。

使用NSURLSession層次的API如下


guard let url =  URL(string:"https://raw.githubusercontent.com/LeoMobileDeveloper/ReactNativeFiles/master/person.json") else{return;}   letdataTask= URLSession.shared.dataTask(with: url) { (data, response, error) in guard let data =data  else{return; }do{let json=try JSONSerialization.jsonObject(with:data, options:.allowFragments) print(json) }catch let error{ print(error) }};dataTask.resume()


使用Alamofire

Alamofire.request("https://raw.githubusercontent.com/LeoMobileDeveloper/React-Native-Files/master/person.json").responseJSON { (response) in if let JSON = response.result.value {

        print("JSON: \(JSON)")

    }

}


可以看到,使用系統的API,我們不得不先建立URL,然後建立DataTask,並且Resume。接著在callback裡去解析JSON。由於Swift是一種強型別的語言,我們不得不進行大量的邏輯判斷和try-catch。

而Alamofire把這些步驟簡化成了一個靜態的方法呼叫,並且用鏈式的方式來處理非同步的Response解析。由於是鏈式的,你可以用鏈式的方式實現很多邏輯,比如驗證返回值:

Alamofire.request("https://httpbin.org/get")

    .validate(statusCode: 200..<300) //返回值驗證   

.responseData { response in //解析返回的資料     

  switch response.result {

        case .success:

            print("Validation Successful")

        case .failure(let error):

            print(error)

        }

    }

鏈式的非同步處理有很多優點:

優雅的處理大量的callback

程式碼更容易理解,更容易維護

不需要在每一步都進行錯誤檢查

3.繼承

NRULSessionTask是由繼承來實現的,繼承關係如下

URLSessionTask — Task的基類 

URLSessionDataTask - 拉取URL的內容NSData 

URLSessionUploadTask — 上傳資料到URL,並且返回是NSData

URLSessionDownloadTask - 下載URL的內容到檔案

URLSessionStreamTask — 建立TCP/IP連線

仿照這種關係,Alamofire的Request也是類似的繼承關係:

Request — Task的基類 

DataRequest - 拉取URL的內容NSData 

UploadRequest — 上傳資料到URL,並且返回是NSData

DownloadRequest - 下載URL的內容到檔案

StreamRequest — 建立TCP/IP連線

其實原因和很簡單:父類提供基礎的屬性和方法來給子類複用。

在Request中,除了繼承,還使用了聚類的方式:由父類提供介面,初始化子類

4.協議

Swift是面向協議程式設計的語言。

Alamofire 大量使用了協議和代理。

Alamofire是一個優雅的Swift開源庫,它的程式碼真的很優雅,強烈建議對Swift感興趣並且想深入學習的同學用幾天的空餘時間去研究下。看的時候多問自己幾個問題:

為什麼這裡要用protocol而不用繼承?

為什麼這裡要用struct而不用class?

…..

總之,多問為什麼,然後找到答案,就會很有收穫。

參考文章

下一篇介紹一下Moya的設計之道

moya

相關文章