iOS 原生网络请求快速回顾

URL Loading System

在了解Alamofire,AFNetworking以前,须要复习原生网络是怎么使用的。swift

主要分为三大块, URLSessionConfigurationURLSessionURLSessionTask缓存

URLSessionConfiguration

URLSessionConfigurationURLSession初始化时,必须传入的参数,设定如何去使用caches,cookies等缓存策略,或者超时时间的设定,或者是否容许在非wifi的移动网上使用等等。 在建立时,主要分为三类。服务器

  1. Default。默认设定。
  2. ephemeral。不对caches, cookies, or credentials使用存储。
  3. backgroud。容许上传下载等操做能够在后台执行。

在使用URLSessionConfiguration建立URLSession须要注意: 在初始化以前,须要对Config进行充足的设定,在建立后Session会拷贝一份保存,因此这时候再对Config进行修改,则不会影响Session。若是这时候须要修改一些Config的内容,就只能经过更新Config后再从新建立Session。cookie

在大部分状况下,NSURLRequest可以override Configruation中的内容,好比超时时间的设定,但对于某些严格的参数,好比allowsCellularAccess,则不能覆盖。网络

URLSession

经过设定URLSessionConfiguration以后,就能够建立URLSession,URLSession的主要功能就是建立一个或者多个 URLSessionTask的实例。session

在建立时,能够指定URLSessionDelegate 以及 delegateQueue,若是不须要delegate,直接传入nil便可。闭包

init(configuration: URLSessionConfiguration, delegate: URLSessionDelegate?, delegateQueue queue: OperationQueue?)
复制代码

URLSessionDelegate的继承关系: URLSessionDelegate -> URLSessionTaskDelegate -> [URLSessionDataDelegate, URLSessionDownloadDelegate, URLSessionStreamDelegate, URLSessionWebSocketDelegate]app

须要注意的是,这里的Degelate是会被Session以强引用的方式持有,若是没有对Session调用invalidateAndCancel() 或者finishTasksAndInvalidate(),那么生命周期会知道app关闭,形成内存泄漏。ide

这里的queue是指代调用Delegate中方法或者是completion handlers使用的队列。为了保证正确的顺序,该线程必须是串行队列,若是没有指定,session也会自动建立。性能

若是不指定delegate, 在穿件task以后则执行传入的闭包:

let task = URLSession.shared.dataTask(with: url) { data, response, error in
	dosomething()
}
task.resume()
复制代码

URLSesion

若是指定了delegate,则没必要再传入handler,若是传入,则不会走delegate的回调。

private lazy var session: URLSession = {
    let configuration = URLSessionConfiguration.default
    configuration.waitsForConnectivity = true
    return URLSession(configuration: configuration,
                      delegate: self, delegateQueue: nil)
}()

func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
    self.receivedData?.append(data)
}
复制代码

URLSesion

URLSessionTask

URLSessionTask,由URLSession生成,主要分为四种: URLSessionDataTask:通常请求资源,返回服务器的response,做为NSData对象缓存在内存中。不支持background session生成。 URLSessionUploadTask: 与URLSessionDataTask相似,可是请求中添加request body更加容易。 URLSessionDownloadTask: 支持直接在磁盘中下载文件。 URLSessionStreamTask:流任务从主机名和端口或网络服务对象创建TCP / IP链接。。

在建立Task以后,若是调用了resume,session会自动将其设为强引用,直到请求结束或者失败,因此开发者不必去维持一个引用。

除了resume,还有cancel,suspend等方法进行操做。

缓存系统

URLCache

在网络请求中,会在内存或者磁盘中缓存response,以此提升性能以及减小网络交互。

缓存数据的类叫作URLCache,缓存从NSURLRequest映射为CachedURLResponse的对象。

在磁盘上的缓存也会当磁盘空间低的时候被系统移除,也只会在app未开启的状况下。

若是想自定义URLCache,好比缓存大小,须要在URLSessionConfiguration中设定。

Cache Policy

对于每个URLRequest的实例,都有缓存属性cachePolicy。

为了方便统一管理,能够直接对URLSessionConfiguration的requestCachePolicy属性进行设置,这样每个使用Config的Session生成请求的cachePolicy都会继承。

缓存策略分为4种:

  • reloadIgnoringLocalCacheData: 忽略本地缓存,直接从远端获取资源。
  • returnCacheDataDontLoad:只从缓存中获取,不会对远端发起请求,若是没有缓存则会进入fail,通常用与离线模式。
  • returnCacheDataElseLoad: 从缓存中获取,若是没有缓存则对远端发起请求。
  • useProtocolCachePolicy:默认策略。

若是没有缓存,则发起请求; 若是缓存的响应不须要每次都从新验证,而且缓存的响应没有过时,则返回缓存。若是缓存过时或须要从新验证,则向原始源发出HEAD请求,以查看资源是否已更改。若是修改了,将从原始源获取数据,若是不是,则返回缓存内容。

URLSesion
相关文章
相关标签/搜索