美文网首页好文章收藏夹网络
详细解析几个和网络请求有关的类(四) —— NSURLSessi

详细解析几个和网络请求有关的类(四) —— NSURLSessi

作者: 刀客传奇 | 来源:发表于2018-03-09 00:22 被阅读41次

    版本记录

    版本号 时间
    V1.0 2018.03.05

    前言

    我们做APP发起网络请求,一般都是使用框架,这些框架的底层也都是苹果的API,接下来几篇就一起来看一下和网络有关的几个类。感兴趣的可以看上面几篇文章。
    1. 详细解析几个和网络请求有关的类 (一) —— NSURLSession
    2. 详细解析几个和网络请求有关的类(二) —— NSURLRequest和NSMutableURLRequest
    3. 详细解析几个和网络请求有关的类(三) —— NSURLConnection

    二者的生死关系

    苹果以前的API是2.0 推出的NSURLConnection,但是从iOS 7.0开始NSURLSession开始使用,同时NSURLConnection被弃用,比较典型的就是AFN这个框架的变化,也跟着完成了这个过渡。

    NSURLSession相对于NSURLConnection来说,有很多优势。

    • 后台上传和下载。
    • 可以暂停和重启网络操作。
    • 可以对缓存策略,session类型、任务类型(比如上传、下载等任务)进行单独的配置。
    • 更多更丰富的代理模式。

    NSURLSession 支持HTTP 2.0


    普通任务、上传和下载任务

    NSURLSession针对普通、上传和下载任务专门提供了特殊的类NSURLSessionDataTaskNSURLSessionUploadTaskNSURLSessionDownloadTask进行处理。与NSURLConnection相比更加的专业化。

    1. 普通任务

    当服务器返回的数据量较小的时候,NSURLSessionNSURLConnection执行普通任务的操作步骤没有区别。

    2. 上传任务

    都需要设置POST请求的请求体进行上传。

    3. 下载任务

    这个也是这两个类的最大区别。

    • NSURLConnection下载文件时,使用异步回调先是将整个文件下载到内存,然后再写入到沙盒,如果文件比较大,就会出现内存暴涨的情况。并且,使用异步回调无法监听下载进度。

    • NSURLSession使用NSURLSessionUploadTask下载文件,会默认下载到沙盒中的tem文件中,不会出现内存暴涨的情况,但是在下载完成后会把tem中的临时文件删除,需要在初始化任务方法时,在completionHandler回调中增加保存文件的代码。

    断点续传

    • NSURLConnection进行断点下载,通过设置访问请求的HTTPHeaderFieldRange属性,开启运行循环,NSURLConnection的代理方法作为运行循环的事件源,接收到下载数据时代理方法就会持续调用,并使用NSOutputStream管道流进行数据保存。

    • NSURLSession进行断点下载,当暂停下载任务后,如果downloadTask(下载任务)为非空,调用cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler这个方法,这个方法接收一个参数,完成处理代码块,这个代码块有一个NSData参数resumeData,如果resumeData非空,我们就保存这个对象到视图控制器的resumeData属性中,在点击再次下载时,通过调用[ [self.session downloadTaskWithResumeData:self.resumeData] resume]方法进行继续下载操作。


    请求方法的控制

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

    Session的配置信息

    • NSURLSession的构造方法(sessionWithConfiguration:delegate:delegateQueue)中有一个NSURLSessionConfiguration类的参数可以设置配置信息,其决定了cookie,安全和高速缓存策略,最大主机连接数,资源管理,网络超时等配置。

    • NSURLConnection不能进行这个配置,依赖与一个全局的配置对象,缺乏灵活性。

    参考文章

    1. NSURLSession与NSURLConnection区别
    2. NSURLSession和NSURLConnection比较
    3. NSURLSession 和 NSURLConnection的区别

    后记

    本篇的主要内容是NSURLSessionNSURLConnection的区别,更多的是借鉴别人的总结文章加上自己的理解,参考的文章已经在后面列出来了。

    相关文章

      网友评论

        本文标题:详细解析几个和网络请求有关的类(四) —— NSURLSessi

        本文链接:https://www.haomeiwen.com/subject/icqsfftx.html