IOS-网络(大文件下载)

一、不合理方式

 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 ()<NSURLConnectionDataDelegate>
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 @end
21 
22 @implementation ViewController
23 
24 - (void)viewDidLoad {
25     [super viewDidLoad];
26 
27     self.view.backgroundColor = [UIColor cyanColor];
28 }
29 
30 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
31 {
32     [self download];
33 }
34 
35 - (void)download
36 {
37     //1.NSURL
38     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 *)error
52 {
53     NSLog(@"didFailWithError");
54 }
55 //接收到服务器响应就会调用
56 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
57 {
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 *)data
69 {
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 *)connection
80 {
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 ()<NSURLConnectionDataDelegate>
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 @end
21 
22 @implementation ViewController
23 
24 - (void)viewDidLoad {
25     [super viewDidLoad];
26     
27     self.view.backgroundColor = [UIColor cyanColor];
28  
29 }
30 
31 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
32 {
33     [self download];
34 }
35 
36 - (void)download
37 {
38     //1.NSURL
39     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 *)error
49 {
50     
51 }
52 //接收到服务器响应时调用
53 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
54 {
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 *)data
72 {
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 *)connection
84 {
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 ()<NSURLConnectionDataDelegate>
 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.NSURL
100         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
原文地址:https://www.cnblogs.com/oc-bowen/p/5175207.html