Alamofire是swift中普遍用到的第三方框架,用于我们app中的网络请求,现在来分析一下最新版4.0的源码。
4.0基于swift3.0开发,许多地方以前用到的关键字public,都改成了open。两者的区别在于public在模块内能被继承,而open关键字声明的类或方法模块内外都能被继承。好了,我们首先来分析SessionManager
首先我们要构建继承于 Alamofire.Manager的类HLNetwork,并实现它的单例方法,我们有可能会用到
SessionManager.swift
public init(
configuration: URLSessionConfiguration = URLSessionConfiguration.default,
delegate: SessionDelegate = SessionDelegate(),
serverTrustPolicyManager: ServerTrustPolicyManager? = nil
)
这里的configuration属于URLSessionConfiguration类型(相当于以前的NSURLSessionConfiguration)用于初始化NSURLSession对象,URLSessionConfiguration有3种配置模式:
1.defaultSessionConfiguration(默认,存储请求数据到本地)
2.backgroundSessionConfiguration(一般用于后台下载的请求,其中有可能会用到Manager的backgroundCompletionHandler属性,当后台任务完成时会调用该闭包)
3.ephemeralSessionConfiguration(不存储数据,包括cookie)
这里简单介绍下,具体可以百度一下
然后是SessionDelegate类型的delegate参数,负责响应所有session的回调。
serverTrustPolicyManager,负责session请求的安全策略的单例:
//默认
case PerformDefaultEvaluation(validateHost: Bool)
//验证本地证书
case PinCertificates(certificates: [SecCertificate], validateCertificateChain: Bool, validateHost: Bool)
//验证公钥
case PinPublicKeys(publicKeys: [SecKey], validateCertificateChain: Bool, validateHost: Bool)
//不验证
case DisableEvaluation
//自定义验证
case CustomEvaluation((serverTrust: SecTrust, host: String) -> Bool)
我们可以在用一个数组(类似于[api.xxx.com: 策略, test.xxx.com: DisableEvaluation])来初始化ServerTrustPolicyManager单例,这样的设置的目的是不用验证测试服方便调试。
// 这是项目里面用到比较多的网络请求方法,
HLNetwork.shareNetwork().
request(
Method,
URLStringConvertible,
parameters: [String : AnyObject]?,
encoding: ParameterEncoding,
headers: [String : String]?
)
步骤1.使用url, method, headers初始化一个URLRequest对象。
步骤2.加工请求参数。
步骤3.开始请求数据(如果startRequestsImmediately属性为true)返回DataRequest类型的对象,用于管理该请求任务。请求操作加入到Manager的queue的队列中,task的开始,暂停,取消,完成都会在通知中心post消息,userinfo为URLSessionTask类型的对象,通过它,我们可以利用Manager中的属性--delegate,以delegate[task]的方式来获取指定的类型为DataRequest的对象(就是一个请求任务),里面就有我们想要的所有该请求的信息了。