iOS开发-NSURLSession

NSURLSession

NSURLSession是NSURLConnection的替代品,提供了可选、多样的策略让NSURLRequest访问网络;
一个NSURLSession会对应一个delegate,delegate会在NSURLSession的声明周期中被调用,比如说服务器认证、决定资源是否被下载等。
NSURLSession是线程安全类
默认的NSURLSession采用系统提供的delegate,并且可以取代之前+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]的功能;
NSURLSession会创建NSURLSessionTask类,这个和NSURLConnection类似,但是提供更多的控制和统一的代理模式。
 

NSURLSessionTask

NSURLSessionTask被创建的时候默认是suspended状态(挂起),在执行前需调用resume;
NSURLSessionTask的几个子类是用来语法上区分数据和文件下载。
 
NSURLSessionDataTask类在接受资源的时候,会多次调用URLSession:dataTask:didReceiveData;
这个经常用于接受那些马上被用户使用的数据。
 
NSURLSessionUploadTask和NSURLSessionDataTask的构造方式不同;
上传的任务会通过-URLSession:task:needNewBodyStream:的方式,准确定位到文件或者数据,从而填入上传的body。
 
NSURLSessionDownloadTask会把回应的数据直接写入到一个临时文件;
完成后,delegate会发送一个URLSession:downloadTask:didFinishDownloadingToURL,这时可以把这个临时文件移动到应用沙盒的合适位置,或者直接读取文件;
如果取消,NSURLSessionDownloadTask会产生一个临时数据,用于随后恢复原来的下载任务。
 
在iOS9之后,NSURLSessionStream可以用于TCP/IP连接,通过安全的握手和代理 连接主机的对应端口;
Data的任务可以用NSURLSessionStream实现,需要恰当的配置NSURLSessionConfiguration;
具体可以参考RFC2817和RFC6455,有关Upgrade: header。http://www.ietf.org/rfc/rfc2817.txt
 

NSURLSession类提供http相关接口;这个API提供为认证丰富的代理方法,为app提供后台下载的能力(即使app被挂起);
通过NSURLSession的接口,app可以创建一系列会话,每一个会话包括一个数据相关的任务组;举个例子,如果你在写一个网页浏览器,你的app可能会每一个页签或者每一个窗口新建一个会话;在每一个会话中,你的app会添加一系列任务,每一个任务都代表这一个独特的url请求。
通过这些对话,你可以调度三种类型的任务:数据任务(data)、下载任务(download)和 上传任务(upload)。
和大多数网络层的API一样,NSURLSession是异步的。可以通过下面的多种方式返回数据:
1、用完成的block返回数据;
2、收到数据时,通过delegate回调;
3、完成下载时,通过delegate回调;
NSURLSession提供状态和进度属性,同时支持取消、重新启动、恢复和挂起操作,还提供挂起、取消、下载失败的恢复。
1、NSURLSession   会话类
2、NSURLSessionConfiguration 配置类,用于初始化session
3、NSURLSessionTask  任务基类
4、NSURLSessionDataTask 数据任务类
5、NSURLSessionUploadTask 上传任务类
6、NSURLSessionDownloadTask 下载任务类
NSURLSession 提供四个协议,分别控制任务
1、NSURLSessionDelegate 处理session级别的事件
2、NSURLSessionTaskDelegate 处理所有task级别的事件
3、NSURLSessionDataDelegate 处理task级别的事件,针对data和upload 两个任务
4、NSURLSessionDownloadDelegate 处理task级别的任务,针对download 任务
NSURLSession 也用了很多在NSURLConnection、NSURLDownload里面用的类。
1、NSURL  URL类
2、NSURLRequest 封装了url请求的数据,包括url、请求方式等
3、NSURLResponse 封装了服务器返回的数据,包括MIME类型和长度
4、NSHTTPURLResponse 增加了专门用于http请求的回复,比如说response header(响应头)
5、NSCacheURLResponse 封装了一个NSURLResponse,还有具体的服务器response数据,以便用于缓存
 

NSCopying相关

如果对session或者task,返回同一个类;
如果对configuration,返回新的类,可以分别修改;
 

重定向

一些协议,类似http,提供了一种让服务器告诉app,链接已经改变为一个新的的url。
当重定向发生的时候,url加载类会通过delegate询问app,是否采用重定向,返回重定向后的response,或者直接返回error。 
 
 

例子 

1、通过url加载本地文件

- (void)testFileInDisk {
    
    NSString* path = [[NSBundle mainBundle] pathForResource:@"ios_url" ofType:@"png"];
    NSURL* url = [NSURL fileURLWithPath:path];
    [[[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //        NSLog(@"data %@", [data description]);
        NSLog(@"response %@", [response description]);
        NSLog(@"error %@", [error description]);
        UIImage* image = [UIImage imageWithData:data];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.imageView setImage:image];
        });
    }] resume];
}

 

2、通过url加载web文件

- (void)testUrl {
    NSURL* url = [NSURL URLWithString:@"http://www.baidu.com/"]; //这里和https的不同
    [[[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        NSLog(@"string %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        NSLog(@"response %@", [response description]);
        NSLog(@"error %@", [error description]);
        UIImage* image = [UIImage imageWithData:data];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.imageView setImage:image];
        });
    }] resume];
}

 

例子在:

https://github.com/loyinglin/LearnNSURLSession

 
 
 

 

posted on 2016-03-07 09:49  loying  阅读(412)  评论(0编辑  收藏  举报

导航