Alamofire (5)—— Response

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


Alamofire 目錄直通車 --- 和諧學(xué)習(xí),不急不躁!


Alamofire 請求數(shù)據(jù)之后,我們就會回調(diào)響應(yīng),但是底層是如何保證響應(yīng)必然在請求之后的呢?以及 AlamofireResponse 到底是什么東西,這一篇詳細講解。

一、Response

1:response的執(zhí)行順序

首先我們先來看這段代碼

SessionManager.default
    .request(urlString)
    .response { (response) in
        print(response)
    }

Alamofire 一個非常關(guān)鍵的類就是 Request ,請看下面這段代碼是鏈式調(diào)用,但是怎么保證 responserequest 之后呢?

  • 我們 response 的任務(wù)是加入到了 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
    }()
}
  • 這個隊列的并發(fā)數(shù)為 1
  • 初始化出來是默認掛起狀態(tài)
  • 請求完成的時候:把隊列的掛起狀態(tài)取消了,那么這個時候就可以正常執(zhí)行任務(wù)
  • 剛剛在加入到這個隊列里面的任務(wù)就可以在請求完成的時候順序執(zhí)行 Soga

2:response的作用

response 分為四種

  • DefaultDataResponse
  • DataResponse
  • DefaultDownloadResponse
  • DownloadResponse

這里可以看到并沒有 upload 相關(guān)的,為什么???那是因為 upload 返回的就是普通數(shù)據(jù),就沒有必要重新封裝。

其中 Default 開頭就是返回原始數(shù)據(jù),沒有進過其他處理,不加 Default 可以通過序列化器處理!大家可以對比下面兩個方法,不難得出結(jié)果

  • 其實如果細心的你,???? 應(yīng)該很容易可以得出,其實這里封裝 Response 和我們傳統(tǒng)的 Response 不是同一個。里封裝 Response 是一個數(shù)據(jù)儲存模型 ,里面保存對外所需要的數(shù)據(jù)
self.request = request
self.response = response
self.data = data
self.error = error
self.timeline = timeline

三、序列化器

就拿我們最熟悉的 json 序列化器來給大家一起討論

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 的方法
  • 第三個參數(shù)是序列化器的初始化
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 類型的序列化器
  • 其中參數(shù)就是一個閉包,這個閉包帶有一個返回值類型 ResultRequest.serializeResponseJSON
  • 之前上面就是對這個初始化出來的DataResponseSerializer 的參數(shù)閉包的調(diào)用: 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)))
        }
    }
  • 很簡單的封裝驗證了一些數(shù)據(jù)
  • 然后就是非常熟悉的json序列化器: JSONSerialization.jsonObject
  • 根據(jù)序列化的結(jié)果返回 : .success(json) 或者 .failure(error)

四、總結(jié)

  • 創(chuàng)建一個序列化結(jié)構(gòu)體
  • 通過序列化結(jié)構(gòu)體 - 發(fā)起序列化響應(yīng)閉包
  • 把外界就是 taskDelegate 里面的數(shù)據(jù) -> 傳到我們外界的閉包 - 交給我們自定義的序列或者系統(tǒng)幫我們實現(xiàn)的序列化器實現(xiàn)
  • response 驗證 - response.statusCode 判斷 - 發(fā)出 result
  • result就是我們的序列化器的返回值
  • 同步 operationresult 交給 response 結(jié)構(gòu)體
  • data/downloadResponse 儲存數(shù)據(jù)
  • response回調(diào) 返回 response響應(yīng)數(shù)據(jù)

非常高興我們霸占了簡書 RxSwift ,Alamofire 板塊,只要搜索 RxSwift ,Alamofire 相關(guān)最新文章必然都是一些熟悉的身影~~~ 持續(xù)努力,變平凡為非凡 ?? ?? ??

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容