zoukankan      html  css  js  c++  java
  • NSURLConnection & NSRULSession

    NSURLConnection & NSRULSession

    NSURLSession是NSURLConnection 的替代者,在2013年苹果全球开发者大会(WWDC2013)随ios7一起发布,是对NSURLConnection进行了重构优化后的新的网络访问接口。从iOS9.0开始, NSURLConnection中发送请求的两个方法已过期(同步请求,异步请求),初始化网络连接(initWithRequest: delegate:)的方法也被设置为过期,系统不再推荐使用,建议使用NSURLSession发送网络请求。

    1 NSURLConnection

    1.1  NSURLConnection 中常用的类

    (1)NSURL:请求地址

    (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法、请求头、请求体....

    (3)NSMutableURLRequest:NSURLRequest的子类

    (4)NSURLConnection:负责发送请求,建立客户端和服务器的连接。发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据

    1.2 NSURLConnection的使用步骤

    (1)创建一个NSURL对象,设置请求路径(设置请求路径)

    (2)传入NSURL创建一个NSURLRequest对象,设置请求头和请求体(创建请求对象)

    (3)使用NSURLConnection发送NSURLRequest(发送请求)

    注:发送请求的时候包括

    同步请求:即一直等待服务器返回数据,有返回值,容易卡住代码

    异步请求:没有返回值,不会造成卡

    默认的NSURLRequest请求是GET 请求

    2      NSRULSession

    NSURLSession是iOS7中新的网络接口,它与NSURLConnection是并列的。程序在前台时,NSURLSession与NSURLConnection可以互为替代工作。注意,如果用户强制将程序关闭,NSURLSession会断掉。

    2.1 NSRULSession提供的功能

    > 通过URL将数据下载到内存

    > 通过URL将数据下载到文件系统

    > 将数据上传到指定URL

    > 在后台完成上述功能

    2.2 NSURLSession提供的三个类方法进行配置信息

    default 方法:配置信息使用基于硬盘的持久Cache,保证用户的信息到钥匙串,使用共享的 cookie 进行存储.

    Ephemeral方式:和default方式大致一致,除了不会将cache, 证书,或者任何 session 相关的数据保存到硬盘中,而是保存到内存中.生命周期和 session 一致.应用实例:浏览器的无痕功能的实现.

    Background 方式:配置信息可以创建一个在后台或者APP 已经关闭的情况下传输数据的 session.注:后台 APP 在创建的时候一定要赋予一个标示符,这样在 APP 下次启动的时候可以很顺利的找到对应的.如果用户关闭了 APP,iOS会关闭所有的 background session,而且,被用户强制性关闭后, iOS 不会唤醒 APP, 除非用户自己点击 APP.

    3 比较

    3.1 NSURLSession针对下载/上传等复杂的网络操作提供了专门的解决方案,针对普通、上传和下载分别对应三种不同的网络请求任务:NSURLSessionDataTask, NSURLSessionUploadTask和NSURLSessionDownloadTask.。

    注意:创建的task都是挂起状态,需要resume才能执行。

    3.2 当服务器返回的数据较小时,NSURLSession与NSURLConnection执行普通任务的操作步骤没有区别。

    执行上传任务时,NSURLSession与NSURLConnection一样同样需要设置POST请求的请求体进行上传。

    执行下载任务的时候,NSURLConnection下载文件时,先将整个文件下载到内存,然后再写入沙盒,如果文件比较大,就会出现内存暴涨的情况。而使用NSURLSessionDownloadTask下载文件,会默认下载到沙盒中的tem文件夹中,不会出现内存暴涨的情况.但在下载完成后会将tem中的临时文件删除,因此需要在初始化任务方法时,在completionHandler回调中增加保存文件的代码。代码如下NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"http://127.0.0.1/dawenjian.zip"] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {

       //获取沙盒的caches路径

       NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"kkk.dmg"];

       //生成URL路径

       NSURL *DCurl = [NSURL fileURLWithPath:path];

       //将文件保存到指定文件目录下

       [[[NSFileManager defaultManager] moveItemAtURL:location toURL:DCurl error:nil] resume];

    3.3 请求过程的控制

    NSURLConnection实例化对象,实例化开始,默认请求就发送(同步发送),不需要调用start方法。而cancel 可以停止请求的发送,停止后不能继续访问,需要创建新的请求。

    NSURLSession有三个控制方法,取消(cancel),暂停(suspend),继续(resume),暂停后可以通过继续恢复当前的请求任务。

    3.4 断点续传

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

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

    经过以上比较可以发现,使用NSURLSession进行断点下载更加便捷。

    3      总结

    3.1  NSURLConnection的小结

    1、iOS2.0出现,iOS9.0后废弃的网络请求发送方式

    2、可以在初始化时确定发送同步还是异步的请求,并且可以选择执行队列。

      +(void)sendAsynchronousRequest

      +(nullable NSData *)sendSynchronousRequest: 这里是有返回值的

    3、使用NSURLConnection发送异步请求,这样下载大数据会存在问题(要全部加载到内存中,再写入),内存会爆。

    4、使用 NSURLConnection 的代理方法 dataDelegate  ,注意:NSURLConnection有多个代理协议,downloadDelegate不好用。

    5、NSURLConnection实例化对象,实例化开始,默认请求就发送(同步发送),不需要start。

    6、通过代理方法,进行文件的下载操作(大数据),配合NSFileHandle/ NSOutputStream

    7、start  没什么卵用

       cancel  可以停止请求的发送

    3.2  NSURLSession的小结

    1、iOS 7.0/2013,替代NSURLConnection,简单,方便。都是异步发送 

    2、实例化NSURLSession对象 

    (1)单例:对于简单的,不需要监听网络请求过程的网络会话。

    (2)自定义对象:需要监听网络进度,自定义 NSURLSession 对象,并且设置代理。这时还需要一个 NSURLSessionConfiguration,可以设置全局的网络访问属性.

    (3)使用代理的注意:

    <1>一旦添加了网络完成之后的blcok回调,那么block回调就会被优先执行,代理方法就会失效!

    <2>文件下载完毕/网络请求完成之后下载的文件就会从tmp路径中自动删除!

    (4)网络任务的具体概念:三种网络任务类型:普通请求(dataTask),文件下载(downloadTask),文件上传(uploadTask)     

    (5)关于断点续传:ResumeData

       <1>暂停/取消下载(cancelByProducingResumeData),一旦执行下面取消下载任务的方法,会自动生成一个 resumeData ,就是下次断点续传开始需要的数据!

    <2>通过之前下载的数据 ResumeData ,实例化一个下载任务,用于断点续传.

    3.3 NSURLConnection和NSURLSession对比

    1、前者以在iOS9.0已经被废弃,后者iOS7.0诞生

    2、前者可以在初始化时确定发送同步还是异步的请求,并且可以选择执行队列。而后者只能异步发送网络请求(默认子线程执行)。

    3、实例化方式不同

    (1)前者有类方法,可以不用实例化直接发送同步或异步请求。

    (2)后者有单例对象,也可自定义对象。

    4、网络任务概念的区别

    NSURLSession 采用网络任务的概念:task 来实现网络请求。 一共三种不同的网络任务(普通,上传,下载)

    5、关于请求的启动

    NSURLSession 默认实例化网络任务后,是挂起的,需要resume

    6、使用场景区别: 

    (1) 普通的网络任务:服务器返回的是 JSON/XML/HTML 等数据量比较小. 与 NSUrlConnection 的异步网络请求没有任何区别!

    (2) 文件上传: 默认NSUrlSession 的文件上传走的是 PUT 请求.文件上传跟 NSUrlConnection 也基本没有区别.   

    (3) 文件下载: 如果服务器返回的是一些比较大的数据,NSUrlSession 的下载做的是最好的,封装的非常全面

    7、关于下载“大文件”时的不同

    (1)  NSUrlConnection 使用dataDelegate监控下载进度,需要配合NSFileHandle 或者 NSOutputStream(文件不存在可以创建)进行数据的存储。

          NSUrlSession 下载使用自己的方法(生成downloadTask,然后resume,在回调中提供数据)

    (2)NSURLSession下载完成后,会删除内容(temp文件夹中的文件)

    8、关于断点续传的不同

    (1)NSUrlConntection 需要使用代理方法,同时,设置请求头的range属性

    (2)NSURLSession通过暂停或取消,生成resumeData,需要续传时,根据resumeData生成新任务。

    在普通的应用场景下NSURLSession与NSURLConnection相比没有什么优势,但是在程序切换到后台之后Session就显得更加灵活了。

  • 相关阅读:
    【转】Ext.data.Store加载及显示数据
    WPF中通过MVVM模式来关闭View
    深入浅出JavaScript (六)分析DOM模型
    深入浅出 JQuery (一) 浅析JQuery
    深入浅出JavaScript (五) 详解Document.write()方法
    深入浅出JavaScript (四)DHTML
    深入浅出jQuery (五) 如何自定义UIDialog?
    BS部分整体学习
    深入浅出JQuery (三) 图片预览效果
    深入浅出AJAX (一) 轻松入门
  • 原文地址:https://www.cnblogs.com/xuan-yuan/p/5451996.html
Copyright © 2011-2022 走看看