Alamofire源码分析(8)——adapter、valida
2020-12-21 本文已影响0人
无悔zero
今天来探索一下Alamofire的一些常见函数和属性:
(一)adapter(适配器)
adapter
可对request
进行处理或重定向,公司一般都有自己的一套请求参数,在这里便可以进行统一处理:
SessionManager.default.adapter = TestAdapter()
SessionManager.default.request(url)
.response { (response) in
print(response)
}
//自定义Adapter
class TestAdapter: RequestAdapter {
func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
if token != nil {
//1.适配
request.setValue(token, forHTTPHeaderField: "token")
return request
}else {
//2.重定向
let newUrlRequest = URLRequest.init(url: tokenUrl)
return newUrlRequest
}
}
}
- 源码分析
- 首先
RequestAdapter
是协议,需要实现方法:
- 然后看看
SessionManager.default.adapter
,在创建URLSessionTask
时会进行adapt
,再使用返回的request
进行创建URLSessionTask
:
(二)validate(检验)
网络请求回来时,我们可以对结果进行检验,而且公司一般有自己的一套错误码,也可以在这里进行检验:
Alamofire.request(url)
.response { (response) in
print(response)
}.validate { (request, response, data) -> Request.ValidationResult in
if response.statusCode == 404 {
return .failure(NSError.init(domain: "error", code: 404, userInfo: nil))
}
return .success
}
- 源码分析
- 先来看看
validate
,会被添加到validations
。如果数据回来时检验到错误,会保存到request.delegate.error
:
- 在网络请求回来时,便会调用进行检验:
(三)retrier(重试)
网络请求不满意时,便可对此次请求进行重试:
SessionManager.default.retrier = TestRetrier()
SessionManager.default.request(url)
.response { (response) in
print(response)
}
class TestRetrier: RequestRetrier {
func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {
//判断error
if error {
completion(true,1)//再次请求
}else {
completion(false,0)//不请求了
}
}
}
- 源码分析
- 先看看
RequestRetrier
是协议:
- 然后看看
SessionManager.default.retrier
,在网络请求回来时,检验出error
后,便可进行重试:
- 最终会再新建
URLSessionTask
进行task.resume()
,由于RequestRetrier
一直是同一个所以可以控制重试次数:
(四)startRequestsImmediately(是否直接开始请求)
这个主要控制请求是否直接开始:
SessionManager.default.startRequestsImmediately = false
SessionManager.default.request(url)
.response { (response) in
print("需要手动resume")
}.resume()
- 源码分析
-
startRequestsImmediately
默认为true
,如果我们设置为false
,便不会自动resume()
,需要通过返回的DataRequest
进行手动resume()
: