NSURLConnection断点下载相比较NSURLSession断点下载更复杂一些,因为很多方法得自己写,所以更加推荐使用NSURLSession断点下载,而且NSURLConnection以后估计也不会更新了,NSURLSession慢慢会取代它,但是还是有很多程序用的是Connection。
断点下载步骤:
(1)一些需要用的声明,和上一篇基本一样
@property(nonatomic,strong) NSFileHandle *writeHandle;
@property(nonatomic,assign) long long totalLength;
@property(nonatomic,assign) long long currentLength;
@property(nonatomic,strong) UIProgressView *progessView;
@property(nonatomic,strong) NSURLConnection *conn;
(2)一个按钮控制暂停还是下载,注意:NSURLConnection 只有取消 没有暂停,想暂停任务只能取消NSURLConnection
- (void)download:(UIButton *)btn
{
// 状态取反
btn.selected=!btn.isSelected;
if (btn.selected) {// download
[self startDownload];
}else{ // pause
//NSURLConnection 只有取消 没有暂停
[self.conn cancel];
self.conn=nil;
}
}
(3)下载任务,重点是实现了每次下载从self.currentLength 开始下载,放在请求头里
- (void)startDownload{
NSURL *url=[NSURL URLWithString:@"http://m2yd.pc6.com/mac/WeChatzhCN.dmg"];
// 只有NSMutableURLRequest能改变请求头
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
/**
* 设置请求头
注意不用进行加1操作 从0开始下载
*/
// 一下操作实现了每次下载从self.currentLength 开始下载
NSString *range=[NSString stringWithFormat:@"bytes=%lld-",self.currentLength];
[request setValue:range forHTTPHeaderField:@"Range"];
// 下载 自动发起一个异步请求
self.conn=[NSURLConnection connectionWithRequest:request delegate:self];
}
(4)下载链接成功方法,重点是:if (self.currentLength) return; 因为如果要是当前下载进度不为0的话,(就是不是一开始下载,是暂停之后继续下载)这样就不调用这个方法,以为如果调用这个方法又会创建一个新文件,以下载的数据就没了
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
if (self.currentLength) return;
NSString *caches=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
NSString *filepath=[caches stringByAppendingPathComponent:@"WeChatzhCN.dmg"];
// 先创建一个0kb文件 到沙盒
NSFileManager *mgr=[NSFileManager defaultManager];
NSLog(@"%@",filepath);
[mgr createFileAtPath:filepath contents:nil attributes:nil];
// 创建写数据的文件句柄
self.writeHandle=[NSFileHandle fileHandleForWritingAtPath:filepath];
//得到下载文件总大小
self.totalLength=response.expectedContentLength;
}
(5)接收下载数据,重点是:在这里记录当前一共下载多少了
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// 移动到文件的最后写入数据
[self.writeHandle seekToEndOfFile];
[self.writeHandle writeData:data];
self.currentLength+=data.length;
NSLog(@"下载进度%f",(double)self.currentLength/self.totalLength);
self.progessView.progress=(double)self.currentLength/self.totalLength;
}
(6)下载完成,收尾操作
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
self.currentLength = 0;
self.totalLength = 0;
// 关闭文件
[self.writeHandle closeFile];
self.writeHandle=nil;
}
总结注意点,重点:
(1)暂停任务只能取消NSURLConnection
(2)重点是实现了每次下载从self.currentLength 开始下载,放在请求头里
(3)下载链接成功时,重点是盘算if (self.currentLength) return; 因为如果要是当前下载进度不为0的话,(就是不是一开始下载,是暂停之后继续下载)这样就不调用这个方法,以为如果调用这个方法又会创建一个新文件,以下载的数据就没了
(4)接收下载数据时,要在方法里记录当前一共下载多少了
版权声明:本文为博主原创文章,未经博主允许不得转载。