https://github.com/Alamofire/Alamofire/
Alamofire是iOS Swift居家必备的http交互良品, 目前github上已经2万多星了。 学习Alamofire可以更好的使用它, 并学习Swift的语法。 我先后完整的看了4遍, 并运行demo并debug出调用时序,对Swift的理解更全面了。
Alamofire是对iOS原生类URLSession, URLSessionDelegate, URLSessionTask和URLSessionTaskDelegate的封装, 每个Request创建一个URLSessionTask实例后执行来实现http交换, 使用OperationQueue链式处理http响应的序列化。
下图是Alamofire代码结构,Alamofire类是就是一层对SessionManager封装, 其中SessionDelegate、SessionManager和TaskDelegate是核心类, 看懂这3个类就明白Alamofire的执行流程了。
Alamofire将请求分为DataRequest、DownloadRequest、UploadRequest和StreamRequest,与之对应的是响应DefaultDataResponse、DataResponse、DefaultDownloadResponse和DownloadResponse。
看过OkHttp源码的都知道它里面有个Interceptor拦截器, 作用就是篡改请求头和数据;Alamofire也实现了类似的逻辑叫做RequestAdapter, 实现协议接口从而修改request请求的原始参数。
下面看看Request是怎么执行的: 例如一个普通的POST字符串操作, 最终走到URLSessionManager的request函数。
默认startRequestsImmediately为真, 所以每次创建request后都会执行resume方法即执行http交互。
/// Whether to start requests immediately after being constructed. `true` by default.
open var startRequestsImmediately: Bool = true
PS: 如果将startRequestsImmediately设为false, 那么就需要你主动调用resume方法, 否则这个Request一直存在SessionDelegate对象的requests数组中(delegate[task]=request)。 Response也是通过查找requests数组来执行对应的回调。
private var requests: [Int: Request] = [:]
下面介绍Response:
Alamofire支持一个Request对应多个Response, 而Response是按顺序先后执行的。 request.responseString { response in
requestComplete(response.response, response.result)
}.responseJSON { response in
//...
}
因为maxConcurrentOperationCount等于1, 所以queue可认为是单线程队列。
let queue = { () -> OperationQueue in
let operationQueue = OperationQueue()
operationQueue.maxConcurrentOperationCount = 1
operationQueue.isSuspended = true
operationQueue.qualityOfService = .utility
return operationQueue
}()