版权声明:本文为博主原创文章,转载请注明文章出处。 https://blog.csdn.net/qfeung/article/details/75452988
两者的概述
两者的讨论多数是由”AFNetworking2.0和3.0”的问题引起的, 因为AFN 3.0
用NSURLSession
替换了NSURLConnection
, 其实这也是苹果愿意看到的,WWDC2013
上随着iOS 7
一同推出了NSURLConnection
的替代者 - NSURLSession
, 它是对NSURLConnection
进行了重构优化后的新的网络接口.
两者的主要区别
1. 任务的分类
NSURLSession
针对下载/上传等复杂的网络操作提供了专门的解决方案, 普通、上传和下载分别对应三种不同的网络请求任务:NSURLSessionDataTask
, NSURLSessionUploadTask
和NSURLSessionDownloadTask
。刚创建的task
都是挂起状态,需要resume
才能启动。
2. 下载任务的处理
NSURLConnection
下载文件时, 使用异步回调将整个文件下载到内存, 下载完毕后再写入沙盒, 若文件较大, 就会出现内存暴涨的情况(此时就需要进行手动的内存管理, 很麻烦).- 而且
NSURLConnection
使用”Block异步回调”无法监听下载进度, 若要实现”监听下载进度”需要使用”代理的异步回调”. - 使用
NSURLSessionUploadTask
下载文件, Block回调和Delegate可以同时起作用, 会默认下载到沙盒中的tem
文件中, 不会出现内存暴涨的情况, 但是在下载完成后会把tem
中的临时文件删除, 需要在初始化任务方法时, 在completionHandler
回调中增加保存文件的代码.
3. 请求任务的控制
NSURLConnection
实例化对象, 实例化开始, 默认请求就发送(同步发送), 不需要调用start
方法. 而cancel
可以停止请求的发送, 停止后不能继续访问, 需要创建新的请求.NSURLSession
有三个控制方法, 取消(cancel
)、暂停(suspend
)、继续(resume
), 暂停以后可以通过继续恢复当前的请求任务.
4. 断点续传的方式
NSURLConnection
进行断点下载, 通过设置访问请求的HTTPHeaderField
的Range
属性, 开启运行循环,NSURLConnection
的代理方法作为运行循环的事件源, 接收到下载数据时代理方法就会持续调用, 并使用NSOutputStream
管道流进行数据保存.NSURLSession
进行断点下载, 当暂停下载任务后, 如果downloadTask
(下载任务)为非空, 调用cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler
这个方法, 这个方法接收一个参数, 完成处理代码块, 这个代码块有一个NSData
参数resumeData
, 如果resumeData
非空, 我们就保存这个对象到视图控制器的resumeData
属性中, 在点击再次下载时, 通过调用[[self.session downloadTaskWithResumeData:self.resumeData] resume]
方法进行继续下载操作.- 经过以上比较可以发现, 使用
NSURLSession
进行断点下载更加便捷.
5. 配置信息
NSURLSession
的构造方法sessionWithConfiguration:delegate:delegateQueue
中有一个NSURLSessionConfiguration
类的参数可以设置配置信息, 其决定了cookie
, 安全和高速缓存策略, 最大主机连接数, 资源管理, 网络超时等配置.NSURLSession
可以设置三种配置信息, 分别通过NSURLSessionConfiguration
调用三个类方法返回配置对象, 不过最近发现前两种配置对象改为了属性, 关于这三种配置的详解, 可以参考另一篇博客: 详解NSURLSessionConfiguration.
/*
* Configuration options for an NSURLSession. When a session is
* created, a copy of the configuration object is made - you cannot
* modify the configuration of a session after it has been created.
*
* The shared session uses the global singleton credential, cache
* and cookie storage objects.
*
* An ephemeral session has no persistent disk storage for cookies,
* cache or credentials.
*
* A background session can be used to perform networking operations
* on behalf of a suspended application, within certain constraints.
*/
NS_CLASS_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0)
@interface NSURLSessionConfiguration : NSObject <NSCopying>
#if FOUNDATION_SWIFT_SDK_EPOCH_AT_LEAST(8)
@property (class, readonly, strong) NSURLSessionConfiguration *defaultSessionConfiguration;
@property (class, readonly, strong) NSURLSessionConfiguration *ephemeralSessionConfiguration;
#endif
+ (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier NS_AVAILABLE(10_10, 8_0);
NSURLConnection
不能进行这个配置, 相比较与NSURLConnection
依赖与一个全局的配置对象, 缺乏灵活性而言,NSURLSession
有很大的改进了.