原生 URLSession
在讨论Alamofire之前,我们先看原生URLSession类图结构

其中 URLSessionDelegate
和 URLSessionTask
又衍生出了一些子类,这里没有描述。从图中看出来存在不少缺陷:
- 不符合input model, out model 的设计习惯, 我们需要手动组装URLRequest, 手动对response data 进行解析
- 如果要进行ssl验证 或者重定向控制的话,我们需要创建一个继承于
URLSessionDelegate
的类,同时实现相应的代理方法 - 缓存控制,进度等等都需要额外定制
- 原生api多使用delegate,但现在我们更多的是使用closure
-
URLSessionDelegate
虽然有很多子类,但没有哪个子类是适合任意场景的,我们需要额外定制一个类以适应这些场景
需求分析
- 快速组装URLRequest
- 将response data 解析为model
- 提供进度可选项
- 快速配置服务端认证
- 快速自定义缓存、重定向等各种自定义功能
Alamofire 对URLSession 进行进一步封装
- 将
URLRequest
抽象为URLRequestConvertible
- 使用
ResponseSerialization
将response data 序列化为 model - 使用
SessionDelegate
对URLSessionDelegate
进行二次封装, 提供URLSessionDelegate
所有子类功能默认实现, 并实现消息转发, 将delegate 转为 closure,便于使用 - 使用
Response
对networking result进行封装 - 使用
Request
作为URLSessionTask
载体 - 使用
TaskConvertible
作为URLSessionTask
作为生成器 - 建立
TaskDelegate
作为 单任务的代理。
网络请求时序图:

Class Diagram

水平有限,画的不太好。Alamofire常用场景
- 自定义
URLSession
:
// SessionManager Class
public init?(
session: URLSession,
delegate: SessionDelegate,
serverTrustPolicyManager: ServerTrustPolicyManager? = nil)
你只需要简单传递一个session给SessionManager
构造函数即可,这也是写framework的一个设计原则,在保持便捷性的同时,尽量避免丧失灵活性
- 网络请求:
SessionManager.requestWithURLRequestConvertible
- SessionDelegate:
SessionManager.session.delegate.specSessionDeleagetClosure = {}
- SessionTaskDelegate:
Request.task.delegate.specSessionDeleagetClosure = {}
- responseHandle:
Request.responseHandle = {}
- ServerTrustPolicy
// SessionManager Class
public init?(
session: URLSession,
delegate: SessionDelegate,
serverTrustPolicyManager: ServerTrustPolicyManager? = nil)
上述已经覆盖了绝大部份应用场景,通过构建类图的方式还原Alamofire的设计意图,有助于加深对Alamofire的理解和加强自顶向下的设计思维。
网友评论