Alamofire源码导读一:框架

Alamofire网络请求架构解析
本文详细解析了Alamofire网络请求库的源码架构,主要包括SessionManager、SessionDelegate、Request和TaskDelegate等核心组件的功能及交互。SessionManager作为一切网络请求的起点,通过持有URLSession管理所有请求。SessionDelegate处理所有网络回调,并通过闭包配置响应策略。Request封装了具体的网络请求,而TaskDelegate则负责实现请求协议,处理请求结束后的任务。

源码架构

Alamofire 的源码包括 CoreExtensionsFeaturesSupporting Files。其中主要逻辑在 Core里。
包括构造请求,发起请求,处理回调等。

Core 的架构

Alamofire1

Core 中主要有 SessionManagerSessionDelegateRequestTaskDelegate 这些类。

SessionManager

是一切的起点,它持有一个 URLSession,这个 URLSession 管理着发出的所有网络请求。
它提供了各种方法来生成 Request,也就是网络请求。
它持有一个 SessionDelegate,在其中处理所有系统的网络回调。

SessionDelegate

继承自NSObject
以字典方式持有了所有 Request,key 是URLSessionTasktaskIdentifier。并提供了一个方法,可以根据 URLSessionTask 返回对应的 Request
处理 SessionManager 中的 URLSession 的所有回调。
它提供了各种闭包,对应相应的delegate方法,可以用来配置如何处理网络的回调。外部设置的回调总是优先于默认实现。

/// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)`.
open var taskWillPerformHTTPRedirection: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest) -> URLRequest?)?

/// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)` and
/// requires the caller to call the `completionHandler`.
open var taskWillPerformHTTPRedirectionWithCompletion: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest, @escaping (URLRequest?) -> Void) -> Void)?

比如它定义了两个闭包,来处理重定向问题。在回调中,如果对于的闭包不是空,就会执行这个闭包。

open func urlSession(
    _ session: URLSession,
    task: URLSessionTask,
    willPerformHTTPRedirection response: HTTPURLResponse,
    newRequest request: URLRequest,
    completionHandler: @escaping (URLRequest?) -> Void)
{
    guard taskWillPerformHTTPRedirectionWithCompletion == nil else {
        taskWillPerformHTTPRedirectionWithCompletion?(session, task, response, request, completionHandler)
        return
    }

    var redirectRequest: URLRequest? = request

    if let taskWillPerformHTTPRedirection = taskWillPerformHTTPRedirection {
        redirectRequest = taskWillPerformHTTPRedirection(session, task, response, request)
    }

    completionHandler(redirectRequest)
}

Request

对网络请求的封装,对应一个 underlying 的 URLSessionTask
不同类型的网络请求,有不同的子类,比如DataRequest对应URLSessionDataTask
强持有一个 TaskDelegate

TaskDelegate

用来实现对应Request的协议。
内部有一个串行的OperationQueue,在请求结束后处理任务。
比如常见的responseJSON 函数,其回调就是在这个 OperationQueue 中被执行。

各个类之间的引用关系

 一图胜千言,在请求过程中,持有关系是SessionManager -> SessionDelegate -> Request -> TaskDelegate
在网络返回之后,在SessionDelegate 会清理掉对应的Request

因此,Request 不会被SessionDelegate持有了,但是必须被另一个对象持有。否则,TaskDelegate会被释放,其OperationQueue 中的任务不会被执行。

Request 持有 SessionDelegate

如上图,Request 持有一个 URLSession,而这个URLSessiondelegate 正是 SessionDelegate
因此有一个圈,SessionDelegate->Request->URLSession->SessionDelegate
在网络完成以后,SessionDelegate 会释放对应的Request,从而打破这个循环引用。

附一个URLSession的层级图

sessiondelegates

转载于:https://www.cnblogs.com/huahuahu/p/Alamofire-yuan-ma-dao-du-yi-kuang-jia.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值