Alamofire(5)— Response

😊😊😊Alamofire專題目錄,歡迎及時反饋交流 😊😊😊json


Alamofire 目錄直通車 --- 和諧學習,不急不躁!api


Alamofire 請求數據以後,咱們就會回調響應,可是底層是如何保證響應必然在請求以後的呢?以及 AlamofireResponse 究竟是什麼東西,這一篇詳細講解。安全

1、Response

1:response的執行順序

首先咱們先來看這段代碼網絡

SessionManager.default
    .request(urlString)
    .response { (response) in
        print(response)
    }
複製代碼

Alamofire 一個很是關鍵的類就是 Request ,請看下面這段代碼是鏈式調用,可是怎麼保證 responserequest 以後呢?閉包

  • 咱們 response 的任務是加入到了 delegate.queue.addOperation
  • 交付給了主隊列,畢竟這裏的 response 是給用戶對外提供的,用戶能夠直接UI操做
  • 而後回到閉包出去
init(task: URLSessionTask?) {
    _task = task

    self.queue = {
        let operationQueue = OperationQueue()
        operationQueue.maxConcurrentOperationCount = 1
        operationQueue.isSuspended = true
        operationQueue.qualityOfService = .utility
        return operationQueue
    }()
}
複製代碼
  • 這個隊列的併發數爲 1
  • 初始化出來是默認掛起狀態

  • 請求完成的時候:把隊列的掛起狀態取消了,那麼這個時候就能夠正常執行任務
  • 剛剛在加入到這個隊列裏面的任務就能夠在請求完成的時候順序執行 Soga

2:response的做用

response 分爲四種併發

  • DefaultDataResponse
  • DataResponse
  • DefaultDownloadResponse
  • DownloadResponse

這裏能夠看到並無 upload 相關的,爲何?😕那是由於 upload 返回的就是普通數據,就沒有必要從新封裝。post

其中 Default 開頭就是返回原始數據,沒有進過其餘處理,不加 Default 能夠經過序列化器處理!你們能夠對比下面兩個方法,不可貴出結果學習

  • 其實若是細心的你,😝😝 應該很容易能夠得出,其實這裏封裝 Response 和咱們傳統的 Response 不是同一個。裏封裝 Response 是一個數據儲存模型 ,裏面保存對外所須要的數據
self.request = request
self.response = response
self.data = data
self.error = error
self.timeline = timeline
複製代碼

3、序列化器

就拿咱們最熟悉的 json 序列化器來給你們一塊兒討論ui

public func responseJSON( queue: DispatchQueue? = nil, options: JSONSerialization.ReadingOptions = .allowFragments, completionHandler: @escaping (DataResponse<Any>) -> Void)
    -> Self
{
    return response(
        queue: queue,
        responseSerializer: DataRequest.jsonResponseSerializer(options: options),
        completionHandler: completionHandler
    )
}
複製代碼
  • 這裏封裝了一個 response 的方法
  • 第三個參數是序列化器的初始化
public static func jsonResponseSerializer( options: JSONSerialization.ReadingOptions = .allowFragments)
    -> DataResponseSerializer<Any>
{
    return DataResponseSerializer { _, response, data, error in
        return Request.serializeResponseJSON(options: options, response: response, data: data, error: error)
    }
}
複製代碼
  • 這裏返回的就是 DataResponseSerializer 類型的序列化器
  • 其中參數就是一個閉包,這個閉包帶有一個返回值類型 ResultRequest.serializeResponseJSON
  • 以前上面就是對這個初始化出來的DataResponseSerializer 的參數閉包的調用: DataRequest.jsonResponseSerializer(options: options)
public static func serializeResponseJSON( options: JSONSerialization.ReadingOptions, response: HTTPURLResponse?, data: Data?, error: Error?)
        -> Result<Any>
    {
       // 省略了一些不重要的代碼
        do {
            let json = try JSONSerialization.jsonObject(with: validData, options: options)
            return .success(json)
        } catch {
            return .failure(AFError.responseSerializationFailed(reason: .jsonSerializationFailed(error: error)))
        }
    }
複製代碼
  • 很簡單的封裝驗證了一些數據
  • 而後就是很是熟悉的json序列化器: JSONSerialization.jsonObject
  • 根據序列化的結果返回 : .success(json) 或者 .failure(error)

4、總結

  • 建立一個序列化結構體
  • 經過序列化結構體 - 發起序列化響應閉包
  • 把外界就是 taskDelegate 裏面的數據 -> 傳到咱們外界的閉包 - 交給咱們自定義的序列或者系統幫咱們實現的序列化器實現
  • response 驗證 - response.statusCode 判斷 - 發出 result
  • result就是咱們的序列化器的返回值
  • 同步 operationresult 交給 response 結構體
  • data/downloadResponse 儲存數據
  • response回調 返回 response響應數據

很是高興咱們霸佔了掘金 RxSwift ,Alamofire 板塊,只要搜索 RxSwift ,Alamofire 相關最新文章必然都是一些熟悉的身影~~~ 持續努力,變平凡爲非凡 💪 💪 💪url

就問此時此刻還有誰?45度仰望天空,該死!我這無處安放的魅力!

相關文章
相關標籤/搜索