Alamofire源码分析

来源:互联网 发布:最新的数据库处理技术 编辑:程序博客网 时间:2024/06/03 03:57

        https://github.com/Alamofire/Alamofire/

        Alamofire是iOS Swift居家必备的http交互良品, 目前github上已经2万多星了。 学习Alamofire可以更好的使用它, 并学习Swift的语法。 我先后完整的看了4遍, 并运行demo并debug出调用时序,对Swift的理解更全面了。

       Alamofire是对iOS原生类URLSession,  URLSessionDelegate, URLSessionTask和URLSessionTaskDelegate的封装, 每个Request创建一个URLSessionTask实例后执行来实现http交换, 使用OperationQueue链式处理http响应的序列化。 

       下图是Alamofire代码结构,Alamofire类是就是一层对SessionManager封装, 其中SessionDelegate、SessionManager和TaskDelegate是核心类, 看懂这3个类就明白Alamofire的执行流程了。              


       Alamofire将请求分为DataRequest、DownloadRequest、UploadRequest和StreamRequest,与之对应的是响应DefaultDataResponse、DataResponse、DefaultDownloadResponse和DownloadResponse。


      看过OkHttp源码的都知道它里面有个Interceptor拦截器, 作用就是篡改请求头和数据;Alamofire也实现了类似的逻辑叫做RequestAdapter, 实现协议接口从而修改request请求的原始参数。


      下面看看Request是怎么执行的: 例如一个普通的POST字符串操作, 最终走到URLSessionManager的request函数。


        默认startRequestsImmediately为真, 所以每次创建request后都会执行resume方法即执行http交互。

    /// Whether to start requests immediately after being constructed. `true` by default.    open var startRequestsImmediately: Bool = true



           PS: 如果将startRequestsImmediately设为false, 那么就需要你主动调用resume方法, 否则这个Request一直存在SessionDelegate对象的requests数组中(delegate[task]=request)。 Response也是通过查找requests数组来执行对应的回调。

  private var requests: [Int: Request] = [:]

 

下面介绍Response:     

      Alamofire支持一个Request对应多个Response, 而Response是按顺序先后执行的。
      request.responseString { response in                    requestComplete(response.response, response.result)                }.responseJSON { response in                    //...                }



因为maxConcurrentOperationCount等于1, 所以queue可认为是单线程队列。

let queue = { () -> OperationQueue in     let operationQueue = OperationQueue()    operationQueue.maxConcurrentOperationCount = 1    operationQueue.isSuspended = true    operationQueue.qualityOfService = .utility    return operationQueue}()