NSURLSession与NSURLConnection

版权声明:本文为博主原创文章,转载请注明文章出处。 https://blog.csdn.net/qfeung/article/details/75452988

两者的概述

两者的讨论多数是由”AFNetworking2.0和3.0”的问题引起的, 因为AFN 3.0NSURLSession替换了NSURLConnection, 其实这也是苹果愿意看到的,WWDC2013上随着iOS 7一同推出了NSURLConnection的替代者 - NSURLSession, 它是对NSURLConnection进行了重构优化后的新的网络接口.

两者的主要区别

1. 任务的分类

NSURLSession针对下载/上传等复杂的网络操作提供了专门的解决方案, 普通、上传和下载分别对应三种不同的网络请求任务:NSURLSessionDataTask, NSURLSessionUploadTaskNSURLSessionDownloadTask。刚创建的task都是挂起状态,需要resume才能启动。

2. 下载任务的处理

  • NSURLConnection下载文件时, 使用异步回调将整个文件下载到内存, 下载完毕后再写入沙盒, 若文件较大, 就会出现内存暴涨的情况(此时就需要进行手动的内存管理, 很麻烦).
  • 而且NSURLConnection使用”Block异步回调”无法监听下载进度, 若要实现”监听下载进度”需要使用”代理的异步回调”.
  • 使用NSURLSessionUploadTask下载文件, Block回调和Delegate可以同时起作用, 会默认下载到沙盒中的tem文件中, 不会出现内存暴涨的情况, 但是在下载完成后会把tem中的临时文件删除, 需要在初始化任务方法时, 在completionHandler回调中增加保存文件的代码.

3. 请求任务的控制

  • NSURLConnection实例化对象, 实例化开始, 默认请求就发送(同步发送), 不需要调用start方法. 而cancel可以停止请求的发送, 停止后不能继续访问, 需要创建新的请求.
  • NSURLSession有三个控制方法, 取消(cancel)、暂停(suspend)、继续(resume), 暂停以后可以通过继续恢复当前的请求任务.

4. 断点续传的方式

  • NSURLConnection进行断点下载, 通过设置访问请求的HTTPHeaderFieldRange属性, 开启运行循环, 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有很大的改进了.

猜你喜欢

转载自blog.csdn.net/qfeung/article/details/75452988
今日推荐