ios大文件下载之开始和暂停

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

ios大文件下载之开始和暂停的相关文章

iOS多线程与网络开发之大文件下载 (边下边写/暂停恢复下载/压缩解压zip/多线程下载)

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源码传送:http://dwz.cn/Nret1 A.需求 边下边写入硬盘 显示下载进度 暂停/恢复 下载 解压文件 多线程下载 B.基本知识 1

ios大文件下载封装

1 #import <Foundation/Foundation.h> 2 3 @interface HMFileDownloader : NSObject 4 /** 5 * 所需要下载文件的远程URL(连接服务器的路径) 6 */ 7 @property (nonatomic, copy) NSString *url; 8 /** 9 * 文件的存储路径(文件下载到什么地方) 10 */ 11 @property (nonatomic, copy) NSString *destPath;

IOS NSURLConnection(大文件下载)

一.大文件下载 1.方案:利用NSURLConnection和它的代理方法1> 发送一个请求// 1.URLNSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/resources/videos.zip"];// 2.请求NSURLRequest *request = [NSURLRequest requestWithURL:url];// 3.下载(创建完conn对象后,会自动发起一个异步请求)[N

ios开发网络学习三:NSURLConnection小文件大文件下载

一:小文件下载 #import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> /** 注释 */ @property (nonatomic, strong) NSMutableData *fileData; @property (nonatomic, assign) NSInteger totalSize; @property (weak, nonatomic) IB

【iOS开发-网络】关于大文件下载

大文件下载要使用NSURLConnection的代理方法 首先创建好url发出请求 //创建url NSURL *url = [NSURL URLWithString:@"http://localhost:8080/TFServer/resources/videos/minion_01.mp4"]; //创建请求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //发出一个异步请求 [NSURLConnection

【iOS】文件下载小记

文件的下载分为NSURLConnection与NSURLSession两种,前一种有恨悠久的历史了.使用相对麻烦,后者是新出来的,增加了一些额外的功能. 一.NSURLConnection实现下载 TIPS: 1.当NSURLConnection下载时,得到的NSData写入文件时,data并没有占用多大内存. (即使文件很大) 2.一点点在传. 做的是磁盘缓存.而不是内存缓存机制. 3.了解在NSURLConnection上加代理.[consetDelegateQueue:[[NSOperat

大文件下载--断点续传--NSURLConnection

有了上一篇文章的铺垫直接上代码,下面是分析原理. // ViewController.m // 大文件下载 // Created by apple on 15/11/11. // Copyright © 2015年 LDSmallCat. All rights reserved. #import "ViewController.h" #import "DACircularProgressView.h"//进度条的第三方框架 @interface ViewContro

OC - 16.大文件下载

大文件下载注意事项 若不对下载的文件进行转存,会造成内存消耗急剧升高,甚至耗尽内存资源,造成程序终止. 在文件下载过程中通常会出现中途停止的状况,若不做处理,就要重新开始下载,浪费流量. 大文件下载的解决方案 对下载文件进行处理,每下载一点数据,就将数据写到磁盘中(通常是沙盒中),避免在内存累积数据(NSURLConnection下载) 使用NSFileHandle类实现写数据 使用NSOutputStream类实现写数据 当下载任务终止时,记录任务终止时的位置信息,以便下次开始继续下载 大文件

2016 - 1- 23 大文件下载

---恢复内容开始--- 一: 利用NSFileHandle对象实现大文件下载 1.要了解NSFileHandle的用法,注意下载完要关闭这个对象.还要记得每次写入之前将它的文件指针挪位! // // ViewController.m // 多值参数 // // Created by Mac on 16/1/23. // Copyright © 2016年 Mac. All rights reserved. // #define ZZFile [ [NSSearchPathForDirector