一、URL Session的基本概念
1. 三种工作模式:
- 默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁盘缓存的持久化策略,使用用户keychain中保存的证书进行认证授权。
- 瞬时会话模式(ephemeral):该模式不使用磁盘保存任何数据。所有和会话相关的caches,证书,cookies等都被保存在RAM中,因此当程序使会话无效,这些缓存的数据就会被自动清空。
- 后台会话模式(background):该模式在后台完成上传和下载,在创建Configuration对象的时候需要提供一个NSString类型的ID用于标识完成工作的后台会话。
2. NSURLSession支持的四种任务
NSURLSession类支持四种类型的任务:加载数据,下载和上传,建立一个TCP/IP连接。
二、相关的类
1. NSURLConnection和NSURLSession
NSURLConnection这个名字,实际上指的是一组构成Foundation框架中URL加载系统的相互关联的组件:NSURLRequest,NSURLResponse,NSURLProtocol,NSURLCache,NSHTTPCookieStorage,NSURLCredentialStorage,以及和它同名的NSURLConnection。
在WWDC 2013中,Apple的团队对NSURLConnection进行了重构,并推出了NSURLSession作为替代。
NSURLSession也是一组相互依赖的类,它的大部分组件和NSURLConnection中的组件相同如NSURLRequest,NSURLCache等。而NSURLSession的不同之处在于,它将NSURLConnection替换为NSURLSession和NSURLSessionConfiguration,以及4个NSURLSessionTask的子类:NSURLSessionDataTask, NSURLSessionUploadTask, NSURLSessionDownloadTask,NSURLSessionStreamTask。
iOS为了适应不同的应用场景提供了不同类型的NSURLSessionTask
- NSURLSessionTask : Task的抽象基类
- NSURLSessionDataTask //一般的get、post等请求
- NSURLSessionUploadTask // 用于上传文件或者数据量比较大的请求
- NSURLSessionDownloadTask //用于下载文件或者数据量比较大的请求
- NSURLSessionStreamTask //建立一个TCP/IP连接的主机名和端口或一个网络服务对象。可以执行一个异步的读写
2. NSURLSessionConfiguration
NSURLConnection是全局性的,即它的配置对全局有效,如果有两个链接需要不同的cookies、证书这些公共资源,则NSURLConnection无法满足要求,这时NSURLSession的优势则体现出来,NSURLSession可以同过NSURLSessionConfiguration可以设置全局的网络访问属性。
1 2 3
| NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; // delegateQueue:请求完成回调函数和代理函数的运行线程,如果为nil则系统自动创建一个串行队列,不影响sessionTask的运行线程 NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
|
三种会话方式:
- defaultSessionConfiguration:进程内会话(默认会话),类似 NSURLConnection的标准配置,用硬盘来缓存数据。
- ephemeralSessionConfiguration:临时的进程内会话(内存),不会将cookie、缓存储存到本地,只会放到内存中,当应用程序退出后数据也会消失,可以用于实现“秘密浏览”。
- backgroundSessionConfiguration:建立后台会话可以在应用程序挂起,退出,崩溃的情况下运行上传和下载任务,后台另起一个线程。另外,系统会根据设备的负载程度决定分配下载的资源,因此有可能会很慢甚至超时失败。
设置一些网络属性:
- HTTPAdditionalHeaders:可以设置出站请求的数据头
1 2 3 4 5 6
| configuration.HTTPAdditionalHeaders = @{ @"Accept": @"application/json", @"Accept-Language": @"en", @"Authorization": authString, @"User-Agent": userAgentString };
|
- networkServiceType,设置网络服务类型
- NSURLNetworkServiceTypeDefault 默认
- NSURLNetworkServiceTypeVoIP VoIP
- NSURLNetworkServiceTypeVideo 视频
- NSURLNetworkServiceTypeBackground 后台
- NSURLNetworkServiceTypeVoice 语音
- NSURLNetworkServiceTypeCallSignaling 电话
- allowsCellularAccess:允许蜂窝访问
- timeoutIntervalForRequest:请求的超时时长
- timeoutIntervalForResource:响应的超时时长
- requestCachePolicy:缓存策略
注意事项:如果是自定义会话并指定了代理,会话会对代理进行强引用,在视图控制器销毁之前,需要取消网络会话,否则会造成内存泄漏