iOS开发网络篇—文件下载(四·暂停和恢复)

iOS开发网络篇—文件下载(四·暂停和恢复)

一、Range简单说明

通过设置请求头Range可以指定每次从网路下载数据包的大小

Range示例

bytes=0-499 从0到499的头500个字节

bytes=500-999 从500到999的第二个500字节

bytes=500- 从500字节以后的所有字节

bytes=-500 最后500个字节

bytes=500-599,800-899 同时指定几个范围

Range小结

- 用于分隔

前面的数字表示起始字节数

后面的数组表示截止字节数,没有表示到末尾

, 用于分组,可以一次指定多个Range,不过很少用

二、代码示例

  1 #import "YYViewController.h"
  2
  3 @interface YYViewController ()
  4 //文件数据
  5 @property(nonatomic,strong)NSMutableData *fileData;
  6 //文件句柄
  7 @property(nonatomic,strong)NSFileHandle *writeHandle;
  8 //当前获取到的数据长度
  9 @property(nonatomic,assign)long long currentLength;
 10 //完整数据长度
 11 @property(nonatomic,assign)long long sumLength;
 12 //是否正在下载
 13 @property(nonatomic,assign,getter = isdownLoading)BOOL downLoading;
 14 //请求对象
 15 @property(nonatomic,strong)NSURLConnection *cnnt;
 16 //获取按钮
 17 @property (weak, nonatomic) IBOutlet UIButton *btn;
 18 //获取进度条
 19 @property (weak, nonatomic) IBOutlet UIProgressView *progress;
 20 //按钮点击事件
 21 - (IBAction)star;
 22
 23 @end
 24
 25 @implementation YYViewController
 26
 27 - (void)viewDidLoad
 28 {
 29     [super viewDidLoad];
 30 }
 31
 32 - (IBAction)star {
 33     //当下载完成后,点击按钮文字变为已下载
 34
 35     //判断当前是否正在下载
 36     if (self.isdownLoading) {//如果当前正在下载,那么点击按钮,按钮变为暂停状态
 37         [self.btn setTitle:@"下载" forState:UIControlStateNormal];
 38         self.downLoading=NO;
 39
 40         //取消发送请求
 41         [self.cnnt cancel];
 42         self.cnnt=nil;
 43     }else
 44     {//如果当前没有下载,那么点击按钮,开始或者是继续下载
 45         [self.btn setTitle:@"暂停" forState:UIControlStateNormal];
 46         self.downLoading=YES;
 47         //创建下载路径
 48         NSURL *url=[NSURL URLWithString:@"http://192.168.1.53:8080/MJServer/resources/video.zip"];
 49
 50         //创建一个请求
 51 //        NSURLRequest *request=[NSURLRequest requestWithURL:url];
 52         NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
 53
 54         //设置请求头信息
 55         //self.currentLength字节部分重新开始读取
 56         NSString *value=[NSString stringWithFormat:@"bytes=%lld-",self.currentLength];
 57         [request setValue:value forHTTPHeaderField:@"Range"];
 58
 59         //发送请求(使用代理的方式)
 60         self.cnnt=[NSURLConnection connectionWithRequest:request delegate:self];
 61 //        [self.cnnt start];
 62     }
 63 }
 64
 65 #pragma mark- NSURLConnectionDataDelegate代理方法
 66 /*
 67  *当接收到服务器的响应(连通了服务器)时会调用
 68  */
 69 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
 70 {
 71 #warning 判断是否是第一次连接
 72     if (self.sumLength) return;
 73
 74     //1.创建文件存数路径
 75     NSString *caches=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
 76     NSString *filePath=[caches stringByAppendingPathComponent:@"video.zip"];
 77
 78
 79
 80     //2.创建一个空的文件,到沙盒中
 81     NSFileManager *mgr=[NSFileManager defaultManager];
 82     //刚创建完毕的大小是o字节
 83     [mgr createFileAtPath:filePath contents:nil attributes:nil];
 84
 85     //3.创建写数据的文件句柄
 86     self.writeHandle=[NSFileHandle fileHandleForWritingAtPath:filePath];
 87
 88     //4.获取完整的文件长度
 89     self.sumLength=response.expectedContentLength;
 90 }
 91
 92 /*
 93  *当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据)
 94  */
 95 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
 96 {
 97     //累加接收到的数据长度
 98     self.currentLength+=data.length;
 99     //计算进度值
100     double progress=(double)self.currentLength/self.sumLength;
101     self.progress.progress=progress;
102
103
104     //一点一点接收数据。
105     NSLog(@"接收到服务器的数据!---%d",data.length);
106     //把data写入到创建的空文件中,但是不能使用writeTofile(会覆盖)
107     //移动到文件的尾部
108     [self.writeHandle seekToEndOfFile];
109     //从当前移动的位置,写入数据
110     [self.writeHandle writeData:data];
111 }
112
113 /*
114  *当服务器的数据加载完毕时就会调用
115  */
116 -(void)connectionDidFinishLoading:(NSURLConnection *)connection
117 {
118     NSLog(@"下载完毕----%lld",self.sumLength);
119     //关闭连接,不再输入数据在文件中
120     [self.writeHandle closeFile];
121     self.writeHandle=nil;
122
123     //清空进度值
124     self.currentLength=0;
125     self.sumLength=0;
126
127     //设置按钮文字为“已经下载完成”
128     [self.btn setTitle:@"已经下载完成" forState:UIControlStateNormal];
129     [self.btn setEnabled:NO];
130 }
131 /*
132  *请求错误(失败)的时候调用(请求超时\断网\没有网\,一般指客户端错误)
133  */
134 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
135 {
136 }
137 @end

注意:关键代码

从self.currentLength字节部分重新开始读取

NSString *value=[NSString stringWithFormat:@"bytes=%lld-",self.currentLength];

[request setValue:value forHTTPHeaderField:@"Range"];

模拟器运行情况:

程序启动界面:

点击下载按钮后,开始下载文件,此时按钮的提示文字变为暂停。

下载暂停后,点击下载按钮,继续之前的下载。

下载完成后界面效果:

下载完成后,查看项目沙盒:

iOS开发网络篇—文件下载(四·暂停和恢复)

时间: 2024-10-09 22:15:04

iOS开发网络篇—文件下载(四·暂停和恢复)的相关文章

iOS开发网络篇—文件下载(六·压缩和解压)

iOS开发网络篇—文件下载(六·压缩和解压) 一.完成文件下载 需求:完成文件下载 1.在本地服务器中,添加一个图片的压缩文件. 2.代码示例: 文件下载器代码: 头文件 1 // 2 // YYfileDownloader.h 3 // 01-文件的下载(不合理) 4 // 5 // Created by apple on 14-7-1. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 #import <Founda

iOS开发网络篇—文件下载(五&#183;下载功能的封装)

iOS开发网络篇—文件下载(五·下载功能的封装) 一.简单说明 在前面几篇文章介绍下载代码的基础上,此文分析对下载功能进行封装. 通过之前的代码,我们发现仅仅是下载一个文件就需要写很长的代码,那么如果要下载多个文件,就需要写多份代码.在这里,我们把下载一个文件的代码进行封装.控制器只需要知道,下载哪个文件,下载到哪个路径就可以了. 在对下载的功能进行封装后,添加一个文件下载器,一个文件下载器只下载一个文件,封装后如果要下载多个文件的话,那么只需要创建多个文件下载器对象就可以进行控制和下载了. 二

iOS开发网络篇—文件下载(三&#183;进度条)

一.实现下载文件进度控制 1.代码示例 1 #import "YYViewController.h" 2 3 @interface YYViewController () 4 @property(nonatomic,strong)NSMutableData *fileData; 5 @property(nonatomic,strong)NSFileHandle *writeHandle; 6 @property(nonatomic,assign)long long currentLen

iOS开发网络篇—文件下载(二&#183;合理)

iOS开发网络篇—文件下载(二·合理) 一.边下载,边写入 1.思路 把下载的data追加到文件的尾部,直到所有的数据下载完为止. 1.在连通了服务器的时候,创建一个空的文件到沙盒中NSFileManager(文件管理类) 2.创建写数据的文件句柄 3.在接收到服务器返回的数据后,把data写入到创建的空文件中,但是不能使用writeTofile(会覆盖) 3.1移动到文件的尾部 3.2从当前移动的位置,写入数据 4.服务器的数据加载完毕后关闭连接,不再输入数据在文件中 二.代码示例 1 //

iOS开发网络篇—文件下载(一&#183;不合理)

iOS开发网络篇—文件下载(一·不合理) 一.小文件下载 如果文件比较小,下载方式会比较多 直接用NSData的+ (id)dataWithContentsOfURL:(NSURL *)url; 利?NSURLConnection发送一个HTTP请求去下载 如果是下载图片,还可以利用SDWebImage框架 二.沙盒 1.在finder中,系统的一些文件(资源库)是隐藏的,可以通过在终端运行下图的代码,显示隐藏的文件. 显示隐藏系统文件: defaults write com.apple.fin

iOS开发网络篇—使用ASI框架进行文件下载

原文  http://www.cnblogs.com/wendingding/p/3961681.html iOS开发网络篇—使用ASI框架进行文件下载 说明 :本文介绍iOS网络编程中经常用到的框架ASI,如何使用该框架进行文件的下载. 一.简单介绍 代码示例: 1 #import "YYViewController.h" 2 #import "ASIHTTPRequest.h" 3 4 @interface YYViewController () 5 6 7 @

iOS开发网络篇—发送GET和POST请求(使用NSURLSession)

iOS开发网络篇—发送GET和POST请求(使用NSURLSession) 说明: 1)该文主要介绍如何使用NSURLSession来发送GET请求和POST请求 2)本文将不再讲解NSURLConnection的使用,如有需要了解NSURLConnection如何发送请求. 详细信息,请参考:http://www.cnblogs.com/wendingding/p/3813706.html 3)本文示例代码发送的请求均为http请求,已经对info.plist文件进行配置. 如何配置,请参考:

iOS开发网络篇—大文件的多线程断点下载(转)

http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始,创建一个和要下载的文件大小相同的文件(如果要下载的文件为100M,那么就在沙盒中创建一个100M的文件,然后计算每一段的下载量,开启多条线程下载各段的数据,分别写入对应的文件部分). 项目中用到的主要

iOS开发网络篇—多线程断点下载

iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始,创建一个和要下载的文件大小相同的文件(如果要下载的文件为100M,那么就在沙盒中创建一个100M的文件,然后计算每一段的下载量,开启多条线程下载各段的数据,分别写入对应的文件部分). 项目中用到的主要类如下: 完成的实现代码如下: 主控制器中的代码: 1 #import "YYViewControl