ios7引入了nsurlsession,通过它可以支持后台相关的网络操作的新特性:
我们可以看到其中子类化了上传下载的任务,并且支持挂起/恢复/取消的操作;返回的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
结合其对应类的层次关系,相关的几组协议的关系也就不难理解了。