😊😊😊Alamofire專題目錄,歡迎及時反饋交流 😊😊😊json
Alamofire 目錄直通車 --- 和諧學習,不急不躁!api
Alamofire
請求數據以後,咱們就會回調響應,可是底層是如何保證響應必然在請求以後的呢?以及Alamofire
的Response
究竟是什麼東西,這一篇詳細講解。安全
首先咱們先來看這段代碼網絡
SessionManager.default
.request(urlString)
.response { (response) in
print(response)
}
複製代碼
Alamofire
一個很是關鍵的類就是 Request
,請看下面這段代碼是鏈式調用,可是怎麼保證 response
在 request
以後呢?閉包
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
}()
}
複製代碼
response
分爲四種併發
這裏能夠看到並無 upload
相關的,爲何?😕那是由於 upload
返回的就是普通數據,就沒有必要從新封裝。post
其中 Default
開頭就是返回原始數據,沒有進過其餘處理,不加 Default
能夠經過序列化器處理!你們能夠對比下面兩個方法,不可貴出結果學習
Response
和咱們傳統的 Response
不是同一個。裏封裝 Response
是一個數據儲存模型 ,裏面保存對外所須要的數據self.request = request
self.response = response
self.data = data
self.error = error
self.timeline = timeline
複製代碼
就拿咱們最熟悉的 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
類型的序列化器Result
: Request.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)
taskDelegate
裏面的數據 -> 傳到咱們外界的閉包 - 交給咱們自定義的序列或者系統幫咱們實現的序列化器實現response
驗證 - response.statusCode
判斷 - 發出 result
result
就是咱們的序列化器的返回值operation
把 result
交給 response
結構體data/downloadResponse
儲存數據response回調
返回 response響應數據
很是高興咱們霸佔了掘金
RxSwift ,Alamofire
板塊,只要搜索RxSwift ,Alamofire
相關最新文章必然都是一些熟悉的身影~~~ 持續努力,變平凡爲非凡 💪 💪 💪url就問此時此刻還有誰?45度仰望天空,該死!我這無處安放的魅力!