在2017年初的时候,写了两篇文章介绍了Alamofire的基本用法和高级用法。但是这两篇文章都是仅限于如何使用,没有进行更深入的研究。考虑到在应用开发过程中,我们几乎无法避免网络相关的开发,所以决定花一些时间深入研究下Alamofire的源代码。让我们一起看看这个简单易用的网络框架是如何实现的,并且在看代码的过程中学习Swift的编程风格和良好的编程习惯。
在写这个系列的文章时,当时就想只是大概地过一下每一个文件里写了哪些类,每个类的作用大概是什么。但是感觉这样粗略地过一遍,有点过于简单,不能加深我们对网络请求的理解,所以最后决定仔细阅读每一个文件的每一个属性和方法,并且理解作者的意图,这样我们才能真正学到东西。
文件概述
文件名称 | 概述 |
---|---|
AFError & Notifications & DispatchQueue+Alamofire | 这里包含了三个比较简单的文件:1)AFError:整个项目中遇到的错误;2)通知名称;3)队列 |
Timeline | 负责记录整个请求过程中的时间点 |
MultipartFormData | 创建多表单数据 |
NetworkReachabilityManager | 网络状态的工具类 |
Alamofire | 包含了所有请求的入口 |
SessionManager | 用于创建各种请求 |
Request | 主要定义了各种请求类型 |
ParameterEncoding | 三种参数编码的方式 |
SessionDelegate | 处理URLSessionDelegate的所有回调 |
TaskDelegate | 定义了几个delegate类型,处理URLSessionTaskDelegate的回调 |
Response | 处理服务器返回的响应 |
ResponseSerialization | 将服务器返回的响应序列化成我们想要的数据 |
Result | 一个泛型枚举,用于表示请求成功或者失败 |
ServerTrustPolicy | 处理服务器和客户端之间的验证 |
Validation | 如何验证请求 |
类图
Alamofire整个项目的类型如下图(省略了Protocol),图中被箭头指向的是父类:
流程图
Alamofire大概的运行流程图如下:
- 我们调用
.request()
、.download()
、.upload()
和.stream()
时,SessionManager
会创建对应的请求DataRequest
、DownlaodRequest
、UploadRequest
和StreamRequest
- 然后
SessionDelegate
会处理URLSession
对应的回调,TaskDelegate
会处理URLSessionTask
对应的回调 - 调用
.reponse()
、.reponseData()
、.reponseString()
、.reponseJSON()
和.reponsePropertyList()
时,请求会把这些对应的response里面的代码以closure的形式加入到delegate.queue
的operations中 - 请求完成后,在
urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
运行队列的operations,reponse...()
的completionHandler
就会携带有对应的DefaultDataResponse
、DefaultDownloadResponse
、DataResponse<Value>
和DownloadResponse<Value>
。
除了基本的请求和响应外,还有认证之类的,大家可以去自己看看。
如果对这个库不是很熟悉的话,建议大家按顺序来阅读这一系列的文章。此次代码的解析大部分都是直接在代码里面写注释,这样会简洁明了一些。
有任何问题,欢迎大家留言!
欢迎加入我管理的Swift开发群:536353151
,本群只讨论Swift相关内容。
原创文章,转载请注明出处。谢谢!