首页 > 代码库 > iOS开发网络篇—文件下载(四·暂停和恢复)

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=http://www.mamicode.com/[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 *)connection117 {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 *)error135 {136 }137 @end

注意:关键代码

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

        NSString *value=http://www.mamicode.com/[NSString stringWithFormat:@"bytes=%lld-",self.currentLength];

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

模拟器运行情况:

程序启动界面:

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

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

下载完成后界面效果:

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