Alamofire源码分析(一)---Alamofire.swift

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)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • 1. Alamofire结构 Alamofire全部实现共有17个文件组成,如下: Alamofire有五模块组成...
    繁华落尽丶lee阅读 1,974评论 0 3
  • URLSession NSURLSession是iOS7中新的网络接口,与NSURLConnection是并列的。...
    JonesCxy阅读 1,606评论 0 9
  • Alamofire源码解读 AFNetworking的作者Matt Thompson 提出了一个新的类似AFNet...
    spicyShrimp阅读 1,169评论 0 3
  • 今天是中秋节,休息日,除了睡懒觉,还把《老九门》看完了。一部连副官都那么帅的电视剧!让我这个外貌协会会长一饱眼福。...
    木木日记2020阅读 191评论 0 0