Alamofire 源码解析

Alamofire浅析 <一>整体结构

2018-08-30  本文已影响43人  狼性刀锋

原生 URLSession

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


OriginalSession.png

其中 URLSessionDelegateURLSessionTask 又衍生出了一些子类,这里没有描述。从图中看出来存在不少缺陷:

  1. 不符合input model, out model 的设计习惯, 我们需要手动组装URLRequest, 手动对response data 进行解析
  2. 如果要进行ssl验证 或者重定向控制的话,我们需要创建一个继承于 URLSessionDelegate 的类,同时实现相应的代理方法
  3. 缓存控制,进度等等都需要额外定制
  4. 原生api多使用delegate,但现在我们更多的是使用closure
  5. URLSessionDelegate 虽然有很多子类,但没有哪个子类是适合任意场景的,我们需要额外定制一个类以适应这些场景

需求分析

  1. 快速组装URLRequest
  2. 将response data 解析为model
  3. 提供进度可选项
  4. 快速配置服务端认证
  5. 快速自定义缓存、重定向等各种自定义功能

Alamofire 对URLSession 进行进一步封装

  1. URLRequest 抽象为 URLRequestConvertible
  2. 使用 ResponseSerialization 将response data 序列化为 model
  3. 使用 SessionDelegateURLSessionDelegate进行二次封装, 提供 URLSessionDelegate 所有子类功能默认实现, 并实现消息转发, 将delegate 转为 closure,便于使用
  4. 使用 Response 对networking result进行封装
  5. 使用 Request 作为URLSessionTask载体
  6. 使用 TaskConvertible 作为 URLSessionTask 作为生成器
  7. 建立 TaskDelegate作为 单任务的代理。

网络请求时序图:

RequestSequence.png

Class Diagram

ComposeDiagram.png

水平有限,画的不太好。Alamofire常用场景

  1. 自定义URLSession:
// SessionManager Class
public init?(
        session: URLSession,
        delegate: SessionDelegate,
        serverTrustPolicyManager: ServerTrustPolicyManager? = nil)

你只需要简单传递一个session给SessionManager构造函数即可,这也是写framework的一个设计原则,在保持便捷性的同时,尽量避免丧失灵活性

  1. 网络请求: SessionManager.requestWithURLRequestConvertible
  2. SessionDelegate: SessionManager.session.delegate.specSessionDeleagetClosure = {}
  3. SessionTaskDelegate: Request.task.delegate.specSessionDeleagetClosure = {}
  4. responseHandle: Request.responseHandle = {}
  5. ServerTrustPolicy
// SessionManager Class
public init?(
        session: URLSession,
        delegate: SessionDelegate,
        serverTrustPolicyManager: ServerTrustPolicyManager? = nil)

上述已经覆盖了绝大部份应用场景,通过构建类图的方式还原Alamofire的设计意图,有助于加深对Alamofire的理解和加强自顶向下的设计思维。

上一篇 下一篇

猜你喜欢

热点阅读