源码架构



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源码导读一:框架的更多相关文章

  1. Alamofire源码导读三:返回的处理逻辑

     以DataRequest 为例子. 最简单的返回 URLSession 有一个方法,可以构建 URLSessionDataTask func dataTask(with url: URL, com ...

  2. Alamofire源码导读五:错误表示

    AFError is the error type returned by Alamofire. It encompasses a few different types of errors, eac ...

  3. Alamofire源码导读四:统计信息

     时间顺序如上图: self.latency = initialResponseTime - requestStartTime self.requestDuration = requestCompl ...

  4. Alamofire源码导读二:发起请求及内部加锁的逻辑

    以创建一个 DataRequest 为例子  发起请求 创建 SessionManager 顺带也创建了一个 SessionDelegate 持有一个urlSession,持有一个串行的 Dispa ...

  5. iOS开发之Alamofire源码深度解析

    今天博客中的Alamofire源码的版本是以现在最新的3.4版本为例.上篇博客系统的对NSURLSession相关的东西进行了详细的解析,详情请看<详解NSURLSession>,为了就是 ...

  6. iOS开发之Alamofire源码解析前奏--NSURLSession全家桶

    今天博客的主题不是Alamofire, 而是iOS网络编程中经常使用的NSURLSession.如果你想看权威的NSURLSession的东西,那么就得去苹果官方的开发中心去看了,虽然是英文的,但是结 ...

  7. Alamofire源码解读系列(二)之错误处理(AFError)

    本篇主要讲解Alamofire中错误的处理机制 前言 在开发中,往往最容易被忽略的内容就是对错误的处理.有经验的开发者,能够对自己写的每行代码负责,而且非常清楚自己写的代码在什么时候会出现异常,这样就 ...

  8. Alamofire源码解读系列(六)之Task代理(TaskDelegate)

    本篇介绍Task代理(TaskDelegate.swift) 前言 我相信可能有80%的同学使用AFNetworking或者Alamofire处理网络事件,并且这两个框架都提供了丰富的功能,我也相信很 ...

  9. Alamofire源码解读系列(九)之响应封装(Response)

    本篇主要带来Alamofire中Response的解读 前言 在每篇文章的前言部分,我都会把我认为的本篇最重要的内容提前讲一下.我更想同大家分享这些顶级框架在设计和编码层次究竟有哪些过人的地方?当然, ...

随机推荐

  1. JavaScript 的数据类型及其检测

    JavaScript 有几种类型的值? Javascript 有两种数据类型,分别是基本数据类型和引用数据类型.其中基本数据类型包括 Undefined.Null.Boolean.Number.Str ...

  2. spring-data-jpa+hibernate 各种缓存的配置演示

    本文所有测试用代码在https://github.com/wwlleo0730/restjplat 的分支addDB上 目前在使用spring-data-jpa和hibernate4的时候,对于缓存关 ...

  3. 2018.07.07 洛谷 P3939 数颜色(主席树)

    P3939 数颜色 题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不 ...

  4. 一组RS485设备操作命令

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ZNJM ...

  5. C++之类和对象的特性

    简介:C++并不是一个纯粹的面向对象的语言,而是一种基于过程和面向对象的混合型的语言. 凡是以类对象为基本构成单位的程序称为基于对象的程序,再加上抽象.封装.继承和多态就成为面向对象程序. 1.掌握类 ...

  6. docker 命令介绍

    查看镜像 docker images: 列出imagesdocker images -a :列出所有的images(包含历史)docker images --tree :显示镜像的所有层(layer) ...

  7. Perf -- Linux下的系统性能调优工具,第 1 部分

    Perf 简介 Perf 是用来进行软件性能分析的工具. 通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计.它不但可以分析指定应用程序的性能问题 (per t ...

  8. 股票——成交量加权平均价VWAP

    成交量加权平均价是将多笔交易的价格按各自的成交量加权而算出的平均价,若是计算某一证券在某交易日的VWAP,将当日成交总值除以总成交量即可.VWAP可作为交易定价的一种方法,亦可作为衡量机构投资者或交易 ...

  9. OpenGL中的帧缓存

    OpenGL中的帧缓存 在OpenGL窗口中, 左下角的像素为(0, 0). 一般而言, 像素(x, y)占据的矩形区域左下角为(x, y), 右上角为(x+1, y+1). 1. 缓存及其用途 [1 ...

  10. [翻译]CSS3 Media Queries

    Media Queries Official Manual:http://www.w3.org/TR/css3-mediaqueries/ 原文链接:http://www.smashingmagazi ...