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
        }
    }
}
  1. 首先RequestAdapter是协议,需要实现方法:
  1. 然后看看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
    }
  1. 先来看看validate,会被添加到validations。如果数据回来时检验到错误,会保存到request.delegate.error
  1. 在网络请求回来时,便会调用进行检验:
(三)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)//不请求了
        }
    }
}
  1. 先看看RequestRetrier是协议:
  1. 然后看看SessionManager.default.retrier,在网络请求回来时,检验出error后,便可进行重试:
  1. 最终会再新建URLSessionTask进行task.resume(),由于RequestRetrier一直是同一个所以可以控制重试次数:
(四)startRequestsImmediately(是否直接开始请求)

这个主要控制请求是否直接开始:

SessionManager.default.startRequestsImmediately = false
SessionManager.default.request(url)
    .response { (response) in
        print("需要手动resume")
    }.resume()

  1. startRequestsImmediately默认为true,如果我们设置为false,便不会自动resume(),需要通过返回的DataRequest进行手动resume()
上一篇下一篇

猜你喜欢

热点阅读