Alamofire (5)—— Response

??????Alamofire專題目錄,歡迎及時(shí)反饋交流 ??????


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


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

一、Response

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

首先我們先來看這段代碼

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

Alamofire 一個(gè)非常關(guān)鍵的類就是 Request 空幻,請(qǐng)看下面這段代碼是鏈?zhǔn)秸{(diào)用烁峭,但是怎么保證 responserequest 之后呢?

  • 我們 response 的任務(wù)是加入到了 delegate.queue.addOperation
  • 交付給了主隊(duì)列,畢竟這里的 response 是給用戶對(duì)外提供的秕铛,用戶可以直接UI操作
  • 然后回到閉包出去
init(task: URLSessionTask?) {
    _task = task

    self.queue = {
        let operationQueue = OperationQueue()
        operationQueue.maxConcurrentOperationCount = 1
        operationQueue.isSuspended = true
        operationQueue.qualityOfService = .utility
        return operationQueue
    }()
}
  • 這個(gè)隊(duì)列的并發(fā)數(shù)為 1
  • 初始化出來是默認(rèn)掛起狀態(tài)
  • 請(qǐng)求完成的時(shí)候:把隊(duì)列的掛起狀態(tài)取消了约郁,那么這個(gè)時(shí)候就可以正常執(zhí)行任務(wù)
  • 剛剛在加入到這個(gè)隊(duì)列里面的任務(wù)就可以在請(qǐng)求完成的時(shí)候順序執(zhí)行 Soga

2:response的作用

response 分為四種

  • DefaultDataResponse
  • DataResponse
  • DefaultDownloadResponse
  • DownloadResponse

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

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

  • 其實(shí)如果細(xì)心的你坊罢,???? 應(yīng)該很容易可以得出续担,其實(shí)這里封裝 Response 和我們傳統(tǒng)的 Response 不是同一個(gè)。里封裝 Response 是一個(gè)數(shù)據(jù)儲(chǔ)存模型 艘绍,里面保存對(duì)外所需要的數(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
    )
}
  • 這里封裝了一個(gè) response 的方法
  • 第三個(gè)參數(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ù)就是一個(gè)閉包,這個(gè)閉包帶有一個(gè)返回值類型 ResultRequest.serializeResponseJSON
  • 之前上面就是對(duì)這個(gè)初始化出來的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)))
        }
    }
  • 很簡單的封裝驗(yàn)證了一些數(shù)據(jù)
  • 然后就是非常熟悉的json序列化器: JSONSerialization.jsonObject
  • 根據(jù)序列化的結(jié)果返回 : .success(json) 或者 .failure(error)

四诱鞠、總結(jié)

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

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

就問此時(shí)此刻還有誰航夺?45度仰望天空蕉朵,該死!我這無處安放的魅力阳掐!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載始衅,如需轉(zhuǎn)載請(qǐng)通過簡信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末缭保,一起剝皮案震驚了整個(gè)濱河市汛闸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌艺骂,老刑警劉巖诸老,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钳恕,居然都是意外死亡别伏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門忧额,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厘肮,“玉大人,你說我怎么就攤上這事睦番±嗝” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵抡砂,是天一觀的道長大咱。 經(jīng)常有香客問我,道長注益,這世上最難降的妖魔是什么碴巾? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮丑搔,結(jié)果婚禮上厦瓢,老公的妹妹穿的比我還像新娘提揍。我一直安慰自己,他們只是感情好煮仇,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布劳跃。 她就那樣靜靜地躺著,像睡著了一般浙垫。 火紅的嫁衣襯著肌膚如雪刨仑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天夹姥,我揣著相機(jī)與錄音杉武,去河邊找鬼。 笑死辙售,一個(gè)胖子當(dāng)著我的面吹牛轻抱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旦部,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼祈搜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了士八?” 一聲冷哼從身側(cè)響起容燕,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婚度,沒想到半個(gè)月后缰趋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陕见,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了味抖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片评甜。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖仔涩,靈堂內(nèi)的尸體忽然破棺而出忍坷,到底是詐尸還是另有隱情,我是刑警寧澤熔脂,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布佩研,位于F島的核電站,受9級(jí)特大地震影響霞揉,放射性物質(zhì)發(fā)生泄漏旬薯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一适秩、第九天 我趴在偏房一處隱蔽的房頂上張望绊序。 院中可真熱鬧硕舆,春花似錦、人聲如沸骤公。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阶捆。三九已至凌节,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間洒试,已是汗流浹背倍奢。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留儡司,地道東北人娱挨。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像捕犬,于是被迫代替她去往敵國和親跷坝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 原文: Alamofire 4.0 Migration Guide作者: cnoon譯者: kemchenj 譯者...
    kemchenj閱讀 2,958評(píng)論 4 12
  • Alamofire的基本用法 1.請(qǐng)求 這是一個(gè)最簡單的請(qǐng)求碉碉,這個(gè)請(qǐng)求即不需要參數(shù)柴钻,也不需要接收數(shù)據(jù)。接下來我們翻...
    水落斜陽閱讀 3,202評(píng)論 0 16
  • 痛點(diǎn):最近使用Alamofire進(jìn)行數(shù)據(jù)請(qǐng)求垢粮,發(fā)現(xiàn)使用HandyJSON解析String對(duì)象時(shí)贴届,中文屬性值全部亂碼...
    luowanglin閱讀 3,009評(píng)論 2 4
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,869評(píng)論 6 13
  • Alamofire源碼解讀 AFNetworking的作者M(jìn)att Thompson 提出了一個(gè)新的類似AFNet...
    spicyShrimp閱讀 1,131評(píng)論 0 3