Alamofire.swift为网络请求的调用提供了接口,并提供了一些工具方法
1.两个协议URLConvertible和URLRequestConvertible
这两个协议提供了一些工具方法,方便其他类型转换为URL或URLRequest类型,以便发请求使用。
public protocol URLConvertible {
func asURL() throws -> URL
}
public protocol URLRequestConvertible {
func asURLRequest() throws -> URLRequest
}
这两个协议分别定义了生成对应类型的方法。让其他类型来继承这个协议,实现此方法。与写oc的习惯不同,之前写oc时一般直接给类加category,而这里使用的是定义protocol并让需要扩展的类型继承该协议的方法。
注意到函数的返回值是有一个关键字throws,表示一个函数可以抛出错误。一个标有throws关键字的函数被称作throwing函数。这个函数指明了返回值类型,因此throws关键词需要写在箭头(->)的前面。throwing函数可以在内部抛出错误,并将错误传递到函数被调用的地方。
看String的方法实现
extension String: URLConvertible {
public func asURL() throws -> URL {
guard let url = URL(string: self) else { throw AFError.invalidURL(url: self) }
return url
}
}
如果URL(string: self)方法出现异常,就会抛出AFError错误。因为这个方法可能会抛出异常,所以在调用时前面加try关键字,最终通过包裹在外层的Do-Catch来捕获到异常进一步处理。
比如用一个空字符串来创建一个request,Alamofire.request("") ,调用会走到如下这段代码
do {
originalRequest = try URLRequest(url: url, method: method, headers: headers)
let encodedURLRequest = try encoding.encode(originalRequest!, with: parameters)
return request(encodedURLRequest)
} catch {
return request(originalRequest, failedWith: error)
}
URLRequest方法创建时会调用到String的asURL方法并抛出AFError异常,这时代码就会走到catch这里。
2.框架入口
这里提供request,donwload,upload的方法。来创建获取数据,下载,上传的request。他们提供不同参数初始化方法,并都通过调用SessionManager.default来创建。然后通过调用ResponseSerialization里面的responseString方法来发送请求并处理。
Alamofire.request("https://httpbin.org/get").responseString{ response in
print("result = \(response.result)");
print("response = \(String(describing: response.response))");
}
3.URLSession基础
iOS7之前的NSURLConnection 替换成了 NSURLSession、NSURLSessionConfiguration 以及 NSURLSessionTask 的 3 个子类:NSURLSessionDataTask,NSURLSessionUploadTask,NSURLSessionDownloadTask。
与 NSURLConnection 相比,NSURLsession 最直接的改进就是可以配置每个 session 的缓存,协议,cookie,以及证书策略(credential policy),甚至跨程序共享这些信息。这将允许程序和网络基础框架之间相互独立,不会发生干扰。每个 NSURLSession 对象都由一个 NSURLSessionConfiguration 对象来进行初始化,后者指定了刚才提到的那些策略以及一些用来增强移动设备上性能的新选项。
NSURLSession 中另一大块就是 session task。它负责处理数据的加载以及文件和数据在客户端与服务端之间的上传和下载。NSURLSessionTask 与 NSURLConnection 最大的相似之处在于它也负责数据的加载,最大的不同之处在于所有的 task 共享其创造者 NSURLSession 这一公共委托者(common delegate)。