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"];
模拟器运行情况:
程序启动界面:
点击下载按钮后,开始下载文件,此时按钮的提示文字变为暂停。
下载暂停后,点击下载按钮,继续之前的下载。
下载完成后界面效果:
下载完成后,查看项目沙盒:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。