iOS 进阶文集

Alamofire源码分析笔记

2017-10-17  本文已影响44人  繁华落尽丶lee
Alamofire

1. Alamofire结构

Alamofire全部实现共有17个文件组成,如下:

--------接口----------
Alamofire.swift // api 声明

--------请求----------
Request.swift // 请求类,用于构建请求
ParameterEncoding.swift // 参数编码
MultipartFormData.swift // 自定义表单类
ServerTrustPolicy.swift // 服务器验证

--------响应-----------
Response.swift // 相应类,用于构建响应
ResponseSerialization.swift // 响应数据序列化
Validation.swift // 响应数据验证
Result.swift // 请求结果表示
AFError.swift // 错误类型

--------底层-----------
SessionManager.swift // 请求session的管理类,底层使用NSURLSession实现
SessionDelegate.swift // 请求Session的代理对象,主要实现NSURLSession的代理方法以及回调闭包
TaskDelegate.swift // 请求Task任务的代理对象,主要实现NSURLDataTask的代理方法
DispatchQueue+Alamofire.swift //GCD扩展,定义多个不同功能的队列

---------其他-----------
NetworkReachabilityManager.swift // 网络状态监听类
Notifications.swift // 定义通知
Timeline.swift //描述请求有关的时间 结构体

Alamofire有五模块组成,即接口、请求、响应、底层和其他。分析各模块的实现,功能和联系就可以理解Alamofire。

2. Alamofire源码分析

2.1 Alamofire.swift文件

查看源码可以发现分为两部分:

主要分析第二部分:

2.2 Request.swift文件

上面提到每个请求的返回值都是XXXRequest类型。

Request.swift文件中定义了五个类,分别是Request、DataRequest、DownloadRequest、UploadRequest和StreamRequest。其中Request为基类。

2.2.1 Request类

基类Request,定义了与HTTP请求相关的属性和方法。

2.2.2 DataRequest类

子类DataRequest,管理底层的URLSessionDataTask。主要用于简单的HTTP请求,GET和POST等。

2.2.3 DownloadRequest类

子类DownloadRequest,管理底层URLSessionDownloadTask。实现下载请求。包含三个部分辅助类型、属性、和方法。

2.2.4 UploadRequest类

上传请求,DataRequest的子类。三个属性,一个方法。

2.2.5 StreamRequest类

流请求,没有定义属性和方法,是Request的子类。

2.2.6 对比

对比四个子类,他们对应普通请求、下载请求、上传请求和流传输请求。我们注意到一些相似之处,

2.3 ParameterEncoding.swift文件

由名字可以理解该文件负责对请求参数进行转码,如:URL转码、JSON转码和PropertyList转码。三种转码对应三个结构体:URLEncodingJSONEncodingPropertyListEncoding。他们都遵循ParameterEncoding协议。协议只有一个方法:func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest, 把参数转成目标格式,另外还设置HTTP头部的信息。例如Content-Type:application/json

2.4 MultipartFormData.swift文件

构建用于在HTTP或HTTPS主体中上传的multipart/form-data。 目前有两种编码多部分表单数据的方式。 第一种方法是直接在内存中编码数据。 这是非常有效的,但如果数据集太大,可能会导致内存问题。 第二种方式是设计用于较大的数据集,并将所有数据写入磁盘上的单个文件,并具有所有正确的边界分割。 第二种方法必须用于较大的数据集,如视频内容,否则,当您尝试对数据集进行编码时,应用程序可能会耗尽内存。
有关multipart/form-data的更多信息,请参考RFC-2388和RFC-2045规范以及w3表单文档。

涉及到的知识比较深,需要补充一下。开个坑,以后填!

2.5 ServerTrustPolicy.swift文件

服务器验证。开个坑,以后填!

2.6 Response.swift文件

Response.swift中,有四个结构体,分别是DefaultDataResponse/DataResponse, DefaultDownloadResponse/DownloadResponse。 其中Default是未经格式化的。前两个用于普通数据请求和上传,后俩个用于下载。主要功能是存储响应相关值。

2.6.1 DefaultDataResponse/DataResponse结构体

2.6.2 DefaultDownloadResponse/DownloadResponse结构体

2.6.3 对比

无论是DataResponse还是DownloadResponse都有两个方法:public func map<T>(_ transform: (Value) -> T) -> XXXResponse<T>public func flatMap<T>(_ transform: (Value) throws -> T) -> XXXResponse<T>用于数据转化,区别在于后者会抛出异常。无论是服务器原始数据,还是序列化后的数据,都会被存放在result枚举的case绑定的元组中,success为泛型,failure为Error。具体内容后面在Result.swift中讲解。

2.7 ResponseSerialization.swift文件

查看源码,文件由两个协议、两个结构体和多个extension组成。

--------协议---------
1. DataResponseSerializerProtocol
2. DownloadResponseSerializerProtocol

--------结构体--------
1. DataResponseSerializer<Value>
2. DownloadResponseSerializer<Value>

--------Request扩展------
0. Timeline
1. Default
2. Data
3. String
4. JSON
5. Property List

具体内容,后期补充。

2.8 Result.swift

一个枚举类型Result,有两个case: successfailure

两个主要的方法

两者区别,前者不会抛出一样。

2.9 AFError.swift

枚举类型AFError,包含四个内部枚举:

* ParameterEncodingFailureReason // 参数编码错误
* MultipartEncodingFailureReason // 表单错误
* ResponseValidationFailureReason // 响应验证错误
* ResponseSerializationFailureReason // 数据序列化错误

除了四个内部枚举外,AFError本身还有一个,URL无效错误。

另外,还可以通过布尔值判断是否有错误。

AFError.swift涉及到内联枚举,枚举绑定值和提取判断等。

2.10 Validation.swift

Validation.swift主要用于服务器响应数据验证。

由三个扩展组成: Request扩展,DataRequest扩展,DownloadRequest扩展。第一个是基本验证,后两个是对不同的下载需求的验证。

接下来,看看具体实现了什么?

Request扩展

DataRequest扩展

四个方法:

2.11 SessionManager.swift/SessionDelegate.swift/TaskDelegate.swift

SessionManager共有10个属性,主要的几个:

接下来是初始化方法,SessionManager初始化过程:

另外,还有错误处理,重试等内容。

补充

1. URL Loading System架构

URL Loading System

URL加载系统包括加载URL的类,以及一些重要的帮助类。主要的帮助类:协议支持,身份验证和凭据,Cookie存储,配置管理和缓存管理等。

小结

初步学习了Alamofire源码文件,并没有深入探究源码具体实现。后续内容稍后补充,先补补基础知识。🤣

参考

上一篇下一篇

猜你喜欢

热点阅读