博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NSURLSession的前世今生
阅读量:4583 次
发布时间:2019-06-09

本文共 5292 字,大约阅读时间需要 17 分钟。

系统网络框架架构图

前世-NSURLConnection

  NSURLConnection是苹果提供的原生网络访问类,已经有10多年的历史了,它从 iOS 2.0 开始,一直到iOS9被废弃。异步方法在 iOS 5.0 之后才有 ,在 iOS 5.0 之后,是通过代理的方式,来实现网络开发。

NSURLConnection常用类

  • NSURL:请求地址
  • NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法、请求头、请求体....
  • NSMutableURLRequest:NSURLRequest的子类
  • NSURLConnection:负责发送请求,建立客户端和服务器的连接。发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据

NSURLConnection的使用步骤

  • 1.创建一个NSURL对象,设置请求路径
  • 2.通过NSURL再创建一个NSURLRequest对象,设置请求头和请求体
  • 3.使用NSURLConnection发送NSURLRequest

NSURLConnection发送请求的方法

  • 同步
+ (nullable NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse * _Nullable * _Nullable)response error:(NSError **)error;
  • 异步
+ (void)sendAsynchronousRequest:(NSURLRequest*) request                          queue:(NSOperationQueue*) queue              completionHandler:(void (^)(NSURLResponse* _Nullable response, NSData* _Nullable data, NSError* _Nullable connectionError)) handler
  • 代理
- (nullable instancetype)initWithRequest:(NSURLRequest *)request delegate:(nullable id)delegate startImmediately:(BOOL)startImmediatel;- (nullable instancetype)initWithRequest:(NSURLRequest *)request delegate:(nullable id)delegate;+ (nullable NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(nullable id)delegate;

 

今生-NSURLSession

  在WWDC 2013中,Apple的团队对NSURLConnection进行了重构,并推出了NSURLSession作为替代。NSURLSession将NSURLConnection替换为NSURLSessionNSURLSessionConfiguration,以及3个NSURLSessionTask的子类:NSURLSessionDataTaskNSURLSessionUploadTask, 和NSURLSessionDownloadTask

NSURLSession常用类

  • NSURL:请求地址
  • NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法、请求头、请求体....
  • NSURLSessionConfiguration:用于配置NSURLSession工作模式以及网络设置

  • NSURLSessionTask:会话任务,通过NSURLSession创建
  • NSURLSessionDataTask,NSURLSessionUploadTask,NSURLSessionDownloadTask:都是NSURLSessionTask子类
  • NSURLSession:管理所有的Task

NSURLSession使用步骤

  • 创建一个NSURL对象,设置请求路径
  • 通过NSURL再创建一个NSURLRequest对象(可省)
  • 获得会话对象
  • 根据会话对象创建Task
  • 启动任务
//1.创建URL    NSURL *url = [NSURL URLWithString:@"http://xxxx"];        //2.创建请求Request    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:30];        //3.添加配置    NSURLSessionConfiguration * configuration = [NSURLSessionConfiguration defaultSessionConfiguration];        //5.创建session    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];        //6.创建一个请求任务    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {        if (error == nil) {            NSLog(@"data=%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);        } else {            NSLog(@"error=%@",error);        }    }];        //7.启动任务    [dataTask resume];

 

NSURLSession发送请求方法

  • 普通请求
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler; - (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
  • 上传任务
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler; - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(nullable NSData *)bodyData completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
  • 下载任务
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler; - (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler; - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData completionHandler:(void (^)(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;

NSURLSession相比NSURLConnection的优势在哪?

  1. NSURLConnection实例化对象,实例化开始,默认请求就发送(同步发送),不需要调用start方法。而cancel 可以停止请求的发送,停止后不能继续访问,需要创建新的请求。 NSURLSession有三个控制方法,取消(cancel),暂停(suspend),继续(resume),暂停后可以通过继续恢复当前的请求任务。
  2. NSURLSession中的配置类NSURLSessionConfiguration,提供cookie,安全和高速缓存策略,最大主机连接数,资源管理,网络超时等配置。NSURLConnection不能进行这个配置,相比于 NSURLConnection 依赖于一个全局的配置对象,缺乏灵活性而言。

  3. NSURLConnection的下载资源数据是先下到内存,再写入沙盒,NSURLSession的资源数据下载到沙盒,显然NSURLConnection更耗内存。
  4. NSURLConnection进行断点下载,通过设置访问请求的HTTPHeaderField的Range属性,开启运行循环,NSURLConnection的代理方法作为运行循环的事件源,接收到下载数据时代理方法就会持续调用,并使用NSOutputStream管道流进行数据保存。 NSURLSession进行断点下载,当暂停下载任务后,如果 downloadTask (下载任务)为非空,调用 cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler 这个方法,这个方法接收一个参数,完成处理代码块,这个代码块有一个 NSData 参数 resumeData,如果 resumeData 非空,我们就保存这个对象到视图控制器的 resumeData 属性中。在点击再次下载时,通过调用 [ [self.session downloadTaskWithResumeData:self.resumeData] resume]方法进行继续下载操作。 经过以上比较可以发现,使用NSURLSession进行断点下载更加便捷。 

转载于:https://www.cnblogs.com/Lanht/p/11095221.html

你可能感兴趣的文章
最短路径
查看>>
Console-算法[for,if]-一水仙花数(Water flower)
查看>>
IntelliJ-IDEA和Git、GitHub、Gitlab的使用
查看>>
Request——Node世界中被依赖最多的库No.2
查看>>
【共读Primer】26.[4.6]成员访问运算符 Page133
查看>>
8、OpenCV Python 图像直方图
查看>>
判断远程主机是否存在某个文件
查看>>
[SDOI2011]工作安排
查看>>
block change tracking buffer space
查看>>
简单API练手:(1)复制自身程序到windows目录和系统目录下;(2)获得系统的相关信息。...
查看>>
codeforces 722D Generating Sets 【优先队列】
查看>>
【并发编程】延时初始化
查看>>
编程珠玑--左旋字符串
查看>>
【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十四:储存模块
查看>>
模板 - 字符串 - Manacher
查看>>
2017.1.2
查看>>
Ice_cream's world I
查看>>
echarts中国地图散点涟漪效果
查看>>
三.NFS存储服务
查看>>
sql2008日志文件截断
查看>>