IOS URLConnect 分段下载,暂停/重新下载
来源:互联网 发布:jquery加载js 编辑:程序博客网 时间:2024/05/16 19:54
一、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 *)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=[NSString stringWithFormat:@"bytes=%lld-",self.currentLength];
[request setValue:value forHTTPHeaderField:@"Range"];
模拟器运行情况:
程序启动界面:
点击下载按钮后,开始下载文件,此时按钮的提示文字变为暂停。
下载暂停后,点击下载按钮,继续之前的下载。
下载完成后界面效果:
下载完成后,查看项目沙盒:
标签: IOS开发, 网络篇
- 顶
- 2
0 0
- IOS URLConnect 分段下载,暂停/重新下载
- iOS 文件分段下载
- iOS文件分段下载
- URLconnect下载文件破解防盗链
- Android网络编程之——文件断点下载(暂停/继续/重新下载)
- you-get 下载暂停
- iOS 对于下载请求超时重新下载的方法
- iOS m3u8本地缓存播放(控制下载并发、暂停恢复)
- HTTP分段下载
- 分段下载ASIHTTP
- android源码分段下载
- Python分段下载文件
- android文件分段下载
- Java多线程分段下载
- IOS网络篇17之分段下载、断点续传解析
- IOS从客户端实现下载断点续传,可暂停可继续下载
- 大文件下载(暂停和恢复下载)
- android多线程暂停下载-HttpURLConnection
- pureLayout的九宫格布局
- 进程间通讯,通过自定义的URL Scheme启动你的App
- hdu3966 点权模板-树链部分
- 蓝桥杯 历届试题 小朋友排队
- 线程的相关知识
- IOS URLConnect 分段下载,暂停/重新下载
- Oracle查询转换
- Java学习笔记2016.2.18 接口续、单例模式
- Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
- 希尔排序
- 使用Intent传递对象
- Activity的启动模式解析
- 线程:概念与原理
- 排序算法(一)——直接插入排序