Alamofire 关于Response的思考。
你好,我是Emma,今天我们开启对Alamofire 关于Response的思考。主要的思考方向以下方示例为切入点。
示例:
SessionManager.default.request(urlString)
//默认的请求
.response(completionHandler: { (dataResponse) in
dataResponse.response
})
//自定义序列化的请求
.response(responseSerializer: DataResponseSerializer<String>.init(serializeResponse: { (request, response, data, error) -> Result<String> in
print("原始数据:\(response)")
return .success("成功啦")
})) { (dataResponse) in
print(dataResponse)
}
//系统封装过的序列化请求
.responseJSON { (jsonResponse) in
print(jsonResponse)
}
###1.Alamofiren中Response这个角色的作用是什么?
首先在查看源码之前,通过上面的代码我们思考一下,我们认为的Response是用来做什么的?这时候我们很有可能由于使用Alamofire的惯性会认为这个Response的作用是解析result中返回的数据的。这个观点我们用代码验证并订正。
进入Response方法:
1.Response返回的是一个闭包,闭包的参数是DefaultDataResponse,这个包相当于是`{ (lgDataResponse) in
lgDataResponse
}`这个包的处理。
2.添加异步请求队列
`delegate.queue.addOperation {}`
3.返回主线程
`(queue ?? DispatchQueue.main).async {}`
4.创建对象
`var dataResponse`
5.该对象的来源:源方法的声明,方法中的属性,属性的调用,属性的初始化等函数方法的具体下层操作。
//DefaultDataResponse是一个总的结构体,里面保存了很多属性,那么思考这些属性的数据是从什么地方来的呢?
DefaultDataResponse(
request: self.request,
response: self.response,
data: self.delegate.data,
error: self.delegate.error,
timeline: self.timeline
)
总结从上面可以看出Response作用典型的是存储,更像model一些。
###2.Alamofiren中Response保存了什么?
@discardableResult
public func response(queue: DispatchQueue? = nil, completionHandler: @escaping (DefaultDataResponse) -> Void) -> Self {
delegate.queue.addOperation {
(queue ?? DispatchQueue.main).async {
var dataResponse = DefaultDataResponse(
request: self.request,
response: self.response,
data: self.delegate.data,
error: self.delegate.error,
timeline: self.timeline
)
dataResponse.add(self.delegate.metrics)
completionHandler(dataResponse)