源码架构

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的解读 前言 在每篇文章的前言部分,我都会把我认为的本篇最重要的内容提前讲一下.我更想同大家分享这些*框架在设计和编码层次究竟有哪些过人的地方?当然, ...
随机推荐
-
python学习历程之split()方法获取cmd mysql 结果集
if __name__=='__main__': FServerId = raw_input("Please input source id:") GetFileKey(FServ ...
-
Vector和Stack(已过时,不建议使用)
以下内容基于jdk1.7.0_79源码: 什么是Vector和Stack Vector:线程安全的动态数组 Stack:继承Vector,基于动态数组实现的一个线程安全的栈: Vector和Stack ...
-
MySQL 常用命令
mysql -uroot -pXXXXXXXXX //登陆mysql mysqladmin -u 用户名 -p 旧密码 password 新密码 创建数据库并分配用户 create database ...
-
http 超文本传输协议
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为了提供一种发布和接 ...
-
*在Win7中安装JDK1.7并配置环境变量
安装的过程就不废话了. 下面是环境变量的配置. 1. 配置环境变量 单机右键‘计算机--属性’ 2.点击高级系统设置 3.点击‘环境变量’ 4.增加"JAVA_HOME"系统变 ...
-
BTrace系列
http://blog.csdn.net/mgoann/article/category/473844 http://www.cnblogs.com/serendipity/archive/2012/ ...
-
Unity NGUI UILabel文字变色 及相关问题
在同一个UILabel中可以有不同颜色的文字只需要添加BBCode标记[ff0000]Red Label[-],那么在这个标记之间的RedLabel 就会变成红色 注意: 1.文本最终显示的颜色=Co ...
-
借助ssh隧道和中间主机,使本地主机可以直连远程主机
本地主机: localhost 中间主机: kickstart服务器 10.164.229.162 远程主机: fuel 服务器 192.168.0.11 背景:正常情况下,本地不能直 ...
-
SharePoint 读取内容的插件之SharepointPlus
前言 最近,一直在前端和SharePoint进行交互,然后,发现一个好用的插件,分享给大家. 首先,需要添加一个引用,如下图: 当然,我这里只是举个例子,亲们一定要去下载这个库,然后传到服务器或者文档 ...
-
MySQL(十四)管理维护及性能优化
关于MySQL的学习,<MySQL必知必会>这本书呢,看完已经两个月了,一直被工作以及生活的一些琐事拖着,趁着今晚有空闲,就整理完了最后的几章学习笔记,接下来的学习计划呢, 应该是pyth ...