iOS开发网络篇—文件下载(暂停和恢复)
1 #import ""
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 () {//如果当前正在下载,那么点击按钮,按钮变为暂停状态
37 [ setTitle:@"下载" forState:UIControlStateNormal];
38 =NO;
39
40 //取消发送请求
41 [ cancel];
42 =nil;
43 }else
44 {//如果当前没有下载,那么点击按钮,开始或者是继续下载
45 [ setTitle:@"暂停" forState:UIControlStateNormal];
46 =YES;
47 //创建下载路径
48 NSURL *url=[NSURL URLWithString:@"http://192.168.1.53:8080/MJServer/resources/"];
49
50 //创建一个请求
51 // NSURLRequest *request=[NSURLRequest requestWithURL:url];
52 NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
53
54 //设置请求头信息
55 //字节部分重新开始读取
56 NSString *value=[NSString stringWithFormat:@"bytes=%lld-",];
57 [request setValue:value forHTTPHeaderField:@"Range"];
58
59 //发送请求(使用代理的方式)
60 =[NSURLConnection connectionWithRequest:request delegate:self];
61 // [ start];
62 }
63 }
64
65 #pragma mark- NSURLConnectionDataDelegate代理方法
66 /*
67 *当接收到服务器的响应(连通了服务器)时会调用
68 */
69 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
70 {
71 #warning 判断是否是第一次连接
72 if () return;
73
74 //1.创建文件存数路径
75 NSString *caches=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
76 NSString *filePath=[caches stringByAppendingPathComponent:@""];
77
78
79
80 //2.创建一个空的文件,到沙盒中
81 NSFileManager *mgr=[NSFileManager defaultManager];
82 //刚创建完毕的大小是o字节
83 [mgr createFileAtPath:filePath contents:nil attributes:nil];
84
85 //3.创建写数据的文件句柄
86 =[NSFileHandle fileHandleForWritingAtPath:filePath];
87
88 //4.获取完整的文件长度
89 =;
90 }
91
92 /*
93 *当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据)
94 */
95 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
96 {
97 //累加接收到的数据长度
98 +=;
99 //计算进度值
100 double progress=(double)/;
101 =progress;
102
103
104 //一点一点接收数据。
105 NSLog(@"接收到服务器的数据!---%d",);
106 //把data写入到创建的空文件中,但是不能使用writeTofile(会覆盖)
107 //移动到文件的尾部
108 [ seekToEndOfFile];
109 //从当前移动的位置,写入数据
110 [ writeData:data];
111 }
112
113 /*
114 *当服务器的数据加载完毕时就会调用
115 */
116 -(void)connectionDidFinishLoading:(NSURLConnection *)connection
117 {
118 NSLog(@"下载完毕----%lld",);
119 //关闭连接,不再输入数据在文件中
120 [ closeFile];
121 =nil;
122
123 //清空进度值
124 =0;
125 =0;
126
127 //设置按钮文字为“已经下载完成”
128 [ setTitle:@"已经下载完成" forState:UIControlStateNormal];
129 [ setEnabled:NO];
130 }
131 /*
132 *请求错误(失败)的时候调用(请求超时\断网\没有网\,一般指客户端错误)
133 */
134 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
135 {
136 }
137 @end