前言:使用NSURLSessionDownloadTask满足不这个需要离线断点续传的下载需求,所以这里就需要使用NSURLSessionDataTask的代理方法来处理下载大文件,并且实现离线断点续传。

   关于NSURLSessionDownloadTask的知识,可以请读者阅读本人的前篇:《iOS开发之网络编程--2、NSURLSessionDownloadTask文件下载》。

   另外呢,因为NSURLSessionDownloadTask和NSURLSessionDataTask分别都是NSURLSessionTask的上层继承拓展。比如NSURLSessionDownloadTask在代理方法中内部实现了

   将文件边下载边移存到沙盒中,而使用NSURLSessionDataTask就需要自己完成这个过程了,但是NSURLSessionDataTask可以实现离线断点续传。

实现离线的断点续传的基本思路:

  1、比如应用程序下载15M的小视视频,但是下载到5M的时候这个程序可能是因为用户需要其退出或者是意外崩溃退出或者是断网了,导致还有10M没有下载成功。

  2、为了能够在重新启动程序之后还能够继续下载剩下的10M,需要在程序继续下载的时候判断和读取本地缓存中是否存在已经下载的数据和数据长度,然后在该数据长度之后继续下载剩下的部分。

用于测试代码的API接口:http://120.25.226.186:32812/resources/videos/minion_02.mp4

1、NSURLSessionDataTask实现文件下载(未实现离线断点续传下载)

  1-1、编程思路实现细节:
    <a> 创建会话和请求,最后由会话创建请求任务,并启动任务。
    <b>添加协议<NSURLSessionDataDelegate> ,设置代理,实现代理方法。
    <c>在获取服务器返回的响应代理方法中获取文件名和要下载的文件长度,拼接沙盒路径,根据该路径创建输出流,开启输出流。别忘了还需要设置接收服务器响应。
    <d>在获取服务器返回的数据代理方法中,不断的使用输出流将数据写入,并通过获取的数据设置进度条进度。
    <e>在结束服务器请求的代理方法中,关闭输出流,释放输出流的指针。另外可能会需要打印错误信息。
  1-2、代码实现:
  
2、NSURLSessionDataTask实现文件下载(实现离线断点续传下载)
  2-1、编程思路实现细节:

    <a> 根据文件名拼接沙盒路径,直接获取该文件的属性,如果没有该文件,则返回的是nil,如果有该文件,则读取文件其中的一个属性:文件数据的长度。
    <b>创建会话和可变请求,设置请求头信息,告诉服务器返回的数据从已经下载的文件长度后面开始下载,最后由会话创建请求任务,并启动任务。
    <c>添加协议<NSURLSessionDataDelegate> ,设置代理,实现代理方法。
    <d>在获取服务器返回的响应代理方法中获取文件名和要下载的文件长度,拼接沙盒路径,根据该路径创建输出流,开启输出流。别忘了还需要设置接收服务器响应。
    <e>在获取服务器返回的数据代理方法中,不断的使用输出流将数据写入,并通过获取的数据设置进度条进度。
    <f>在结束服务器请求的代理方法中,关闭输出流,释放输出流的指针。另外可能会需要打印错误信息。
    <g>最后别忘了释放会话对象(两种方法均可)
  
  2-2、源码展示:
    
 
 
 
 
 
 
 

iOS开发之网络编程--3、NSURLSessionDataTask实现文件下载(离线断点续传下载)的更多相关文章

  1. iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

    前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但 ...

  2. iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>

    前言:根据前篇<iOS开发之网络编程--2.NSURLSessionDownloadTask文件下载>或者<iOS开发之网络编程--3.NSURLSessionDataTask实现文 ...

  3. iOS开发之网络编程--2、NSURLSessionDownloadTask文件下载

    本文内容大纲: 1.回顾NSURLSessionTask 2.NSURLSessionDownloadTask大文件之block下载 3.NSURLSessionDownloadTask大文件之代理方 ...

  4. iOS开发之网络编程--使用NSURLConnection实现大文件下载

    主要思路(实现下载数据分段写入缓存中) 1.使用NSURLConnectionDataDelegate以及代理方法.2.在成功获取响应的代理方法中,获得沙盒全路径,并在该路径下创建空文件和文件句柄.3 ...

  5. iOS开发之网络编程--5、NSURLSessionUploadTask+NSURLSessionDataDelegate代理上传

    前言:关于NSURLSession的主要内容快到尾声了,这里就讲讲文件上传.关于文件上传当然就要使用NSURLSessionUploadTask,这里直接讲解常用的会和代理NSURLSessionDa ...

  6. iOS开发之网络编程--使用NSURLConnection实现文件上传

    前言:使用NSURLConnection实现文件上传有点繁琐.    本文并没有介绍使用第三方框架上传文件. 正文: 这里先提供用于编码测试的接口:http://120.25.226.186:3281 ...

  7. iOS开发之网络编程--小文件下载

    文件下载方式: 如果下载的文件比较小,下载方式: 直接用NSData的 +(id)dataWithContentsOfURL:(NSURL*)url; 利用NSURLConnection发送一个HTT ...

  8. IOS开发之网络编程--文件压缩和解压缩

    前言: QQ表情包就用到了解压缩,从网络下载的那么多表情文件格式并不是一个一个图片文件,而是多个图片压缩而成的表情压缩包.下面介绍的是iOS开发中会用到的压缩和解压缩的第三方框架的使用. 注意: 这个 ...

  9. iOS开发之网络编程--XCode7 更新以来需要手动设置的内容

    XCode7 更新以来,默认是不允许加载一些http网络请求,是因为现在网络大部分使用更安全的https协议头. 所以,iOS网络编程如果出现请求无效,事先考虑是否设置一下了以下操作:

随机推荐

  1. iframe无刷新跨域上传文件并获取返回值

    通常我们会有一个统一的上传接口,这个接口会被其他的服务调用.如果出现不同域,还需要无刷新上传文件,并且获取返回值,这就有点麻烦了.比如,新浪微博启用了新域名www.weibo.com,但接口还是使用原 ...

  2. Hadoop第5周练习—MapReduce计算气象温度等例子

    :对云计算的看法 内容 :使用MapReduce求每年最低温度 内容 :求温度平均值能使用combiner吗? 内容 :使用Hadoop流求最高温度(awk脚本) 内容 :使用Hadoop流求最高温度 ...

  3. Pop - Facebook 开源 iOS & OS X 动画库

    Pop 是一个可扩展的 iOS & OS X 动画引擎.除了基本的静态动画,它支持弹簧和动态衰减的动画,因此可以用于构建现实的,基于物理的交互效果. 它的 API 可以与现有的 Objecti ...

  4. Laravel 5 多个视图共享数据的方法

    我们都知道模板一般会用到继承,导航栏就是一个很好的例子,但是导航栏的数据如何共享,比如有个导航的文件叫在view/navigation.blade.php 为了简单一点,文件里只有设置了一个变量 {{ ...

  5. Java魔法堂:String.format详解

      目录     一.前言    二.重载方法     三.占位符     四.对字符.字符串进行格式化     五.对整数进行格式化     六.对浮点数进行格式化     七.对日期时间进行格式化 ...

  6. MVC,如何在视图中声明方法,调用方法?

    <div> <!--在视图中申明方法,此方法的类型已经固定为HelperResult--> @helper ShowHello(string s) { <div> ...

  7. CSS--复习之旅(一)

    CSS概述 CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是为了解决内容与表现分 ...

  8. Requested registry access is not allowed(不允许所请求的注册表访问权)

    尝试创建自定义事件日志时,将会收到“Requested registry access is not allowed(不允许所请求的注册表访问权)”错误消息 EventLog.CreateEventS ...

  9. {"集合已修改;可能无法执行枚举操作。"}

    无论是向集合中添加元素还是从集合中删除元素,都会导致集合内部的变化,特别是集合遍历器的变化.例如 List<,,,,}; foreach(int x in list) { list.Remove ...

  10. SQL SERVER实例解析

    什么是SQL SERVER实例 ------------ SQL SERVER实例的概念和“类与对象”的概念很相似.可以把SQL SERVER的安装程序看做是一个类,安装过程则是创建对象的过程,创建出 ...