现在的位置: 首页 > 综合 > 正文

IOS7引入API之NSURLSession入门介绍

2018年05月08日 ⁄ 综合 ⁄ 共 1862字 ⁄ 字号 评论关闭

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


结合其对应类的层次关系,相关的几组协议的关系也就不难理解了。



抱歉!评论已关闭.