Alamofire源码导读一:框架
源码架构

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

Core 中主要有 SessionManager、SessionDelegate、Request和 TaskDelegate 这些类。
SessionManager
是一切的起点,它持有一个 URLSession,这个 URLSession 管理着发出的所有网络请求。
它提供了各种方法来生成 Request,也就是网络请求。
它持有一个 SessionDelegate,在其中处理所有系统的网络回调。
SessionDelegate
继承自NSObject
以字典方式持有了所有 Request,key 是URLSessionTask 的 taskIdentifier。并提供了一个方法,可以根据 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,而这个URLSession 的 delegate 正是 SessionDelegate。
因此有一个圈,SessionDelegate->Request->URLSession->SessionDelegate。
在网络完成以后,SessionDelegate 会释放对应的Request,从而打破这个循环引用。
附一个URLSession的层级图

Alamofire源码导读一:框架的更多相关文章
- Alamofire源码导读三:返回的处理逻辑
 以DataRequest 为例子. 最简单的返回 URLSession 有一个方法,可以构建 URLSessionDataTask func dataTask(with url: URL, com ...
- Alamofire源码导读五:错误表示
AFError is the error type returned by Alamofire. It encompasses a few different types of errors, eac ...
- Alamofire源码导读四:统计信息
 时间顺序如上图: self.latency = initialResponseTime - requestStartTime self.requestDuration = requestCompl ...
- Alamofire源码导读二:发起请求及内部加锁的逻辑
以创建一个 DataRequest 为例子  发起请求 创建 SessionManager 顺带也创建了一个 SessionDelegate 持有一个urlSession,持有一个串行的 Dispa ...
- iOS开发之Alamofire源码深度解析
今天博客中的Alamofire源码的版本是以现在最新的3.4版本为例.上篇博客系统的对NSURLSession相关的东西进行了详细的解析,详情请看<详解NSURLSession>,为了就是 ...
- iOS开发之Alamofire源码解析前奏--NSURLSession全家桶
今天博客的主题不是Alamofire, 而是iOS网络编程中经常使用的NSURLSession.如果你想看权威的NSURLSession的东西,那么就得去苹果官方的开发中心去看了,虽然是英文的,但是结 ...
- Alamofire源码解读系列(二)之错误处理(AFError)
本篇主要讲解Alamofire中错误的处理机制 前言 在开发中,往往最容易被忽略的内容就是对错误的处理.有经验的开发者,能够对自己写的每行代码负责,而且非常清楚自己写的代码在什么时候会出现异常,这样就 ...
- Alamofire源码解读系列(六)之Task代理(TaskDelegate)
本篇介绍Task代理(TaskDelegate.swift) 前言 我相信可能有80%的同学使用AFNetworking或者Alamofire处理网络事件,并且这两个框架都提供了丰富的功能,我也相信很 ...
- Alamofire源码解读系列(九)之响应封装(Response)
本篇主要带来Alamofire中Response的解读 前言 在每篇文章的前言部分,我都会把我认为的本篇最重要的内容提前讲一下.我更想同大家分享这些顶级框架在设计和编码层次究竟有哪些过人的地方?当然, ...
随机推荐
- 【文件下载】Java下载文件的几种方式
[文件下载]Java下载文件的几种方式 摘自:https://www.cnblogs.com/sunny3096/p/8204291.html 1.以流的方式下载. public HttpServl ...
- 2018.10.14 loj#6003. 「网络流 24 题」魔术球(最大流)
传送门 网络流好题. 这道题可以动态建图. 不难想到把每个球iii都拆点成i1i_1i1和i2i_2i2,每次连边(s,i1),(i2,t)(s,i_1),(i_2,t)(s,i1),(i2, ...
- 2018.09.09 bzoj4403: 序列统计(Lucas定理)
传送门 感觉单调不降序列什么的不好做啊. 于是我们序列中下标为i的元素的值加上i,这样就构成了一个单调递增的序列. 问题就变成了: 求出构造长度分别为1 ~ n且每个元素的值在l+1 ~ r+n之间的 ...
- Fiddler实战深入研究(二)[转载]
Fiddler实战深入研究(二) 阅读目录 Fiddler不能捕获chrome的session的设置 理解数据包统计 请求重定向(AutoResponder) Composer选项卡 Filters选 ...
- IP之NCO仿真
NCO仿真要用.vo仿真模型,不能用.v文件 /**************************************************************************** ...
- Redis Cluster原理初步
目录 目录 1 1. 前言 1 2. 槽(slots) 1 3. 路由配置(node.conf) 1 4. 总slots数(cluster.h:16384) 2 5. key的路由 2 6. 将key ...
- 75. Sort Colors(颜色排序) from LeetCode
75. Sort Colors 给定一个具有红色,白色或蓝色的n个对象的数组,将它们就地 排序,使相同颜色的对象相邻,颜色顺序为红色,白色和蓝色. 这里,我们将使用整数0,1和2分别表示红色, ...
- EntityFramework 基本模式和Code-First的简单使用
1.Database-First Database First就是首先建立好数据库,或者存在现成的数据库也可以.然后在vs中添加ADO.Net实体数据模型,找到需要的数据库和表.它是以数据库设计为基 ...
- PriorityQueue源码分析
PriorityQueue其实是一个优先队列,和先进先出(FIFO)的队列的区别在于,优先队列每次出队的元素都是优先级最高的元素.那么怎么确定哪一个元素的优先级最高呢,jdk中使用堆这么一 ...
- 【Linux】文件操作系统调用
一. 文件描述符 在Linux下使用文件描述符来表示设备文件和普通文件.文件描述符是一个整型的数据,所有对文件的操作都通过文件描述符实现.文件描述符的范围是0~OPEN_MAX,系统中有3个已经分配的 ...