美文网首页
Alamofire源码分析(8)——adapter、valida

Alamofire源码分析(8)——adapter、valida

作者: 无悔zero | 来源:发表于2020-12-21 23:41 被阅读0次

    今天来探索一下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()

    相关文章

      网友评论

          本文标题:Alamofire源码分析(8)——adapter、valida

          本文链接:https://www.haomeiwen.com/subject/jusdnktx.html