NSURLSession与NSURLConnection的区别
NSURLSession是2013年苹果全球开发者大会上(WWDC2013)随iOS7一起发布的,是对NSURLConnection进行了重构优化后的新的网络接口。
iOS9.0开始,NSURLConnection中发送请求的两个方法已经过期(同步请求/异步请求),初始化网络连接的方法也被设置为过期,系统不在推荐使用,建议使用NSURLSession发送网络请求。见下图:
https://developer.apple.com/documentation/foundation/nsurlsession?language=occ
NSURLConnection截图 NSURLConnection废弃方法NSURLSession介绍:
NSURLSession API包含许多不同的类,他们以一种相当复杂的方式一起工作,如果您单独阅读参考文档,可能就不太明显。在使用API之前,请阅读URL Loading System概述。第一步,上次和下载小节的文章提供了实用NSURLSession执行常见任务的示例;
附:https://developer.apple.com/documentation/foundation/url_loading_system?language=objc
task from URL sessionsNSURLSession与NSConnection的区别
1、普通任务和上传
NSURLSession针对上传/下载等复杂的网络提供了专门的解决方案,针对普通、上传和下载分别对应三种不同的网络请求任务:NSURLSessionDataTask,NSURLUploadDataTask,NSURLDownloadDataTask。创建的task都是挂起状态,需要resume才能启动。
当服务器返回的数据较小的时候,NSURLSession和NSURLConnection没有什么区别。执行上传任务时,NSURLSession与NSURLConnection一样需要设置POST请求的请求体进行上传。
2、下载任务方式
NSURLConnection下载文件时,先是将整个文件下载到内存,然后在写入到沙盒,如果文件比较大,就会出现内存保障的情况
NSURLSessionDownloadTask下载文件,会默认下载到沙盒的tmp文件中,不会出现内存暴涨的情况,但是在下载完成后会把tmp中的临时文件删除,需要在初始化任务方法时,在completionHandler回调中增加保存文件的代码。
3、请求方法的控制
NSURLConnection实例化对象,实例化开始,默认请求就发送不需要调用start方法。而cancel可以停止请求的发送,停止后不能继续访问,需要创建新的请求。
NSURLSession有三个控制方法,cancel,suspend,resume,暂停后可以通过继续恢复当前的请求任务。
4、断点续传的方式
NSURLConnection进行断点下载,通过设置访问请求的HTTPHeaderField的Range属性,开启运行循环,NSURLConnection的代理方法作为运行循环的事件源,接收到下载数据时代理方法就会持续调用,并使用NSOutputStream管道流进行数据保存。
NSURLSession进行断点下载,当暂停下载任务后,如果downloadTask为空,调用- (void)cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler;这个方法接收一个参数,完成处理代码块,这个代码块有一个NSData类型的resumeData参数,如果resumeData非空,就保存这个对象到视图控制器的resumeData中,在点击再次下载时,通过调用- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler;方法进行继续下载操作。
5、配置信息
NSURLSession通过NSURLSessionConfiguration类的参数可以设置配置信息,其决定了cookie,安全和高速缓存策略,最大主机连接数,资源管理,网络超时等配置。
NSURLConnection不能进行这个配置,而是依赖于一个全局的配置对象,缺乏灵活性