在了解Alamofire,AFNetworking以前,须要复习原生网络是怎么使用的。swift
主要分为三大块, URLSessionConfiguration
、 URLSession
、URLSessionTask
。缓存
URLSessionConfiguration
是URLSession
初始化时,必须传入的参数,设定如何去使用caches,cookies等缓存策略,或者超时时间的设定,或者是否容许在非wifi的移动网上使用等等。 在建立时,主要分为三类。服务器
在使用URLSessionConfiguration
建立URLSession
须要注意: 在初始化以前,须要对Config进行充足的设定,在建立后Session会拷贝一份保存,因此这时候再对Config进行修改,则不会影响Session。若是这时候须要修改一些Config的内容,就只能经过更新Config后再从新建立Session。cookie
在大部分状况下,NSURLRequest
可以override Configruation中的内容,好比超时时间的设定,但对于某些严格的参数,好比allowsCellularAccess,则不能覆盖。网络
经过设定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()
复制代码
若是指定了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)
}
复制代码
URLSessionTask
,由URLSession
生成,主要分为四种: URLSessionDataTask
:通常请求资源,返回服务器的response,做为NSData对象缓存在内存中。不支持background session生成。 URLSessionUploadTask
: 与URLSessionDataTask相似,可是请求中添加request body更加容易。 URLSessionDownloadTask
: 支持直接在磁盘中下载文件。 URLSessionStreamTask
:流任务从主机名和端口或网络服务对象创建TCP / IP链接。。
在建立Task以后,若是调用了resume,session会自动将其设为强引用,直到请求结束或者失败,因此开发者不必去维持一个引用。
除了resume,还有cancel,suspend等方法进行操做。
在网络请求中,会在内存或者磁盘中缓存response,以此提升性能以及减小网络交互。
缓存数据的类叫作URLCache,缓存从NSURLRequest映射为CachedURLResponse的对象。
在磁盘上的缓存也会当磁盘空间低的时候被系统移除,也只会在app未开启的状况下。
若是想自定义URLCache,好比缓存大小,须要在URLSessionConfiguration中设定。
对于每个URLRequest的实例,都有缓存属性cachePolicy。
为了方便统一管理,能够直接对URLSessionConfiguration
的requestCachePolicy属性进行设置,这样每个使用Config的Session生成请求的cachePolicy都会继承。
缓存策略分为4种:
若是没有缓存,则发起请求; 若是缓存的响应不须要每次都从新验证,而且缓存的响应没有过时,则返回缓存。若是缓存过时或须要从新验证,则向原始源发出HEAD请求,以查看资源是否已更改。若是修改了,将从原始源获取数据,若是不是,则返回缓存内容。