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