一、不合理方式
1 // 2 // ViewController.m 3 // IOS_0131_大文件下载 4 // 5 // Created by ma c on 16/1/31. 6 // Copyright © 2016年 博文科技. All rights reserved. 7 // 8 9 #import "ViewController.h"10 11 @interface ViewController ()12 13 //进度条14 @property (weak, nonatomic) IBOutlet UIProgressView *progressView;15 //存数据16 @property (nonatomic, strong) NSMutableData *fileData;17 //文件总长度18 @property (nonatomic, assign) long long totalLength;19 20 @end21 22 @implementation ViewController23 24 - (void)viewDidLoad {25 [super viewDidLoad];26 27 self.view.backgroundColor = [UIColor cyanColor];28 }29 30 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event31 {32 [self download];33 }34 35 - (void)download36 {37 //1.NSURL38 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/resources/videos/minion_01.mp4"];39 //2.请求40 NSURLRequest *request = [NSURLRequest requestWithURL:url];41 //3.下载(创建完conn后会自动发起一个异步请求)42 [NSURLConnection connectionWithRequest:request delegate:self];43 44 //[[NSURLConnection alloc] initWithRequest:request delegate:self];45 //[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];46 //NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];47 //[conn start];48 }49 #pragma mark - NSURLConnectionDataDelegate的代理方法50 //请求失败时调用51 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error52 {53 NSLog(@"didFailWithError");54 }55 //接收到服务器响应就会调用56 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response57 {58 //NSLog(@"didReceiveResponse");59 self.fileData = [NSMutableData data];60 61 //取出文件的总长度62 //NSHTTPURLResponse *resp = (NSHTTPURLResponse *)response;63 //long long fileLength = [resp.allHeaderFields[@"Content-Length"] longLongValue];64 65 self.totalLength = response.expectedContentLength;66 }67 //当接收到服务器返回的实体数据时就会调用(这个方法根据数据的实际大小可能被执行多次)68 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data69 {70 //拼接数据71 [self.fileData appendData:data];72 73 //设置进度条(0~1)74 self.progressView.progress = (double)self.fileData.length / self.totalLength;75 76 NSLog(@"didReceiveData -> %ld",self.fileData.length);77 }78 //加载完毕时调用(服务器的数据完全返回后)79 - (void)connectionDidFinishLoading:(NSURLConnection *)connection80 {81 //NSLog(@"connectionDidFinishLoading");82 //拼接文件路径83 NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];84 NSString *file = [cache stringByAppendingPathComponent:@"minion_01.mp4"];85 //NSLog(@"%@",file);86 87 //写到沙盒之中88 [self.fileData writeToFile:file atomically:YES];89 }90 91 @end
二、内存优化
1 // 2 // ViewController.m 3 // IOS_0201_大文件下载(合理方式) 4 // 5 // Created by ma c on 16/2/1. 6 // Copyright © 2016年 博文科技. All rights reserved. 7 // 8 9 #import "ViewController.h"10 11 @interface ViewController ()12 13 ///用来写数据的句柄对象14 @property (nonatomic, strong) NSFileHandle *writeHandle;15 ///文件总大小16 @property (nonatomic, assign) long long totalLength;17 ///当前已写入文件大小18 @property (nonatomic, assign) long long currentLength;19 20 @end21 22 @implementation ViewController23 24 - (void)viewDidLoad {25 [super viewDidLoad];26 27 self.view.backgroundColor = [UIColor cyanColor];28 29 }30 31 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event32 {33 [self download];34 }35 36 - (void)download37 {38 //1.NSURL39 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/resources/videos/minion_02.mp4"];40 //2.请求41 NSURLRequest *request = [NSURLRequest requestWithURL:url];42 //3.下载(创建完conn后会自动发起一个异步请求)43 [NSURLConnection connectionWithRequest:request delegate:self];44 45 }46 #pragma mark - NSURLConnectionDataDelegate的代理方法47 //请求失败时调用48 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error49 {50 51 }52 //接收到服务器响应时调用53 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response54 {55 //文件路径56 NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];57 NSString *file = [cache stringByAppendingPathComponent:@"minion_02.mp4"];58 NSLog(@"%@",file);59 //创建一个空文件到沙盒中60 NSFileManager *fileManager = [NSFileManager defaultManager];61 [fileManager createFileAtPath:file contents:nil attributes:nil];62 63 //创建一个用来写数据的文件句柄64 self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:file];65 66 //文件总大小67 self.totalLength = response.expectedContentLength;68 69 }70 //接收到服务器数据时调用(根据文件大小,调用多次)71 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data72 {73 //移动到文件结尾74 [self.writeHandle seekToEndOfFile];75 //写入数据76 [self.writeHandle writeData:data];77 //累计文件长度78 self.currentLength += data.length;79 NSLog(@"下载进度-->%lf",(double)self.currentLength / self.totalLength);80 81 }82 //从服务器接收数据完毕时调用83 - (void)connectionDidFinishLoading:(NSURLConnection *)connection84 {85 86 self.currentLength = 0;87 self.totalLength = 0;88 //关闭文件89 [self.writeHandle closeFile];90 self.writeHandle = nil;91 92 }93 @end
三、断点续传
1 // 2 // ViewController.m 3 // IOS_0201_大文件下载(合理方式) 4 // 5 // Created by ma c on 16/2/1. 6 // Copyright © 2016年 博文科技. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface ViewController ()12 13 ///用来写数据的句柄对象 14 @property (nonatomic, strong) NSFileHandle *writeHandle; 15 ///连接对象 16 @property (nonatomic, strong) NSURLConnection *conn; 17 18 ///文件总大小 19 @property (nonatomic, assign) long long totalLength; 20 ///当前已写入文件大小 21 @property (nonatomic, assign) long long currentLength; 22 23 - (IBAction)btnClick:(UIButton *)sender; 24 @property (weak, nonatomic) IBOutlet UIButton *btnClick; 25 26 @property (weak, nonatomic) IBOutlet UIProgressView *progressView; 27 28 @end 29 30 @implementation ViewController 31 32 - (void)viewDidLoad { 33 [super viewDidLoad]; 34 35 self.view.backgroundColor = [UIColor cyanColor]; 36 //设置进度条起始状态 37 self.progressView.progress = 0.0; 38 39 } 40 41 #pragma mark - NSURLConnectionDataDelegate的代理方法 42 //请求失败时调用 43 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 44 { 45 46 } 47 //接收到服务器响应时调用 48 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 49 { 50 if (self.currentLength) return; 51 //文件路径 52 NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; 53 NSString *file = [cache stringByAppendingPathComponent:@"minion_02.mp4"]; 54 NSLog(@"%@",file); 55 //创建一个空文件到沙盒中 56 NSFileManager *fileManager = [NSFileManager defaultManager]; 57 [fileManager createFileAtPath:file contents:nil attributes:nil]; 58 59 //创建一个用来写数据的文件句柄 60 self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:file]; 61 62 //文件总大小 63 self.totalLength = response.expectedContentLength; 64 65 } 66 //接收到服务器数据时调用(根据文件大小,调用多次) 67 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 68 { 69 //移动到文件结尾 70 [self.writeHandle seekToEndOfFile]; 71 //写入数据 72 [self.writeHandle writeData:data]; 73 //累计文件长度 74 self.currentLength += data.length; 75 //设置进度条进度 76 self.progressView.progress = (double)self.currentLength / self.totalLength; 77 78 NSLog(@"下载进度-->%lf",(double)self.currentLength / self.totalLength); 79 80 81 } 82 //从服务器接收数据完毕时调用 83 - (void)connectionDidFinishLoading:(NSURLConnection *)connection 84 { 85 86 self.currentLength = 0; 87 self.totalLength = 0; 88 //关闭文件 89 [self.writeHandle closeFile]; 90 self.writeHandle = nil; 91 //下载完成后,状态取反 92 self.btnClick.selected = !self.btnClick.isSelected; 93 } 94 95 - (IBAction)btnClick:(UIButton *)sender { 96 //状态取反 97 sender.selected = !sender.isSelected; 98 if (sender.selected) { //继续下载 99 //1.NSURL100 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/resources/videos/minion_02.mp4"];101 //2.请求102 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];103 104 //设置请求头105 NSString *range = [NSString stringWithFormat:@"bytes=%lld-",self.currentLength];106 [request setValue:range forHTTPHeaderField:@"Range"];107 108 //3.下载(创建完conn后会自动发起一个异步请求)109 self.conn = [NSURLConnection connectionWithRequest:request delegate:self];110 111 } else { //暂停下载112 [self.conn cancel];113 self.conn = nil;114 115 }116 117 }118 @end