Alamofire源码分析

本文探讨了Alamofire,一个流行的Swift HTTP网络库,如何封装URLSession进行网络交互。通过深入分析Alamofire的核心类SessionDelegate、SessionManager和TaskDelegate,以及其DataRequest、DownloadRequest等子类,理解其执行流程。同时提到了RequestAdapter类似OkHttp的Interceptor,用于修改请求参数。最后,讨论了Request的执行过程和Response的回调机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        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
}()



    




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值