ios7引入了nsurlsession,通过它可以支持后台相关的网络操作的新特性:
1.后台上传下载;
2.不需要通过nsoperation,直接用nsurlsession的api就可以做到网络操作的暂停和恢复。
3.作为可配置的容器:例如你可以设置http头的一些属性并且保存在session里,不用重复去做配置
4.可以子类化并支持私有配置的session
5.对鉴权的回调做了改进,此前nsurlconnection的鉴权回调无法和请求进行匹配,该回调可能来自任意的请求;而现在每个请求都可以在指定的代理方法中对其进行处理.
nsurlsession层次结构示意图:
可以看到,它包含了配置、代理还有用来处理各种任务的task,在task里面实现了各种不同的http请求。task的结构图如下:
我们可以看到其中子类化了上传下载的任务,并且支持挂起/恢复/取消的操作;返回的nsdata需要自己去处理,这点比起afnetworking的便捷程度可以说有所不如,毕竟afnetworking是在更高的层次进行了封装。
进行一次标准的网络操作我们分为如下几步:
step1:配置session,比如配置请求的header;配置是否保存缓存、cookie、证书等
代码示例如下:
NSURLSessionConfiguration
*config = [NSURLSessionConfiguration ephemeralSessionConfiguration];
// 2
[config setHTTPAdditionalHeaders:@{@"Authorization":[Dropbox
apiAuthorizationHeader]}];
// 3
_session =
[NSURLSession sessionWithConfiguration:config];
step2:
使用生成的session调用任务方法,保存方法返回的task;对该task执行resume操作(默认生成的task是处于挂起状态)。
此处的任务方法有两种类型,一种是taskwithurl,一种是taskwithrequest,简单来说只针对url请求就可以调用withurl方法,如果需要在请求中带上更多内容进行一些配置的话需要采用taskwithrequest相关的方法。
代码示例如下:
NSURL*url
= [Dropbox appRootURL];
// 2
NSURLSessionDataTask
*dataTask =
[self.session dataTaskWithURL:url
completionHandler:^(NSData*data,
NSURLResponse *response,
NSError *error){
if
(!error){
// TODO 1: More coming here!
}
}];
// 3
[dataTask resume];
step3:
在上一步请求中的block实现结果解析(nsdata需要根据接口具体情况(一般是服务器侧决定的)解析成可以理解的数据,如json/xml/plist等);也可以不在block中进行相关操作,而是实现相关的代理方法(需要在step1中先设置session的代理),对相关的结果/进度等进行处理。
urlsession相关的代理方法有很多,这里不一一列举,主要有以下几组协议:
@protocol NSURLSessionDelegate <NSObject> // session的代理,相当于所有协议的父类
@protocol NSURLSessionTaskDelegate <NSURLSessionDelegate> // task的代理,其父协议是NSURLSessionDelegate
@protocol NSURLSessionDataDelegate <NSURLSessionTaskDelegate>
// datatask的代理,其父协议是NSURLSessionTaskDelegate
@protocol NSURLSessionDownloadDelegate <NSURLSessionTaskDelegate> // downloadtask的代理,其父协议是NSURLSessionDataDelegate
结合其对应类的层次关系,相关的几组协议的关系也就不难理解了。