IOS - NSURLConnection断点下载

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)接收下载数据时,要在方法里记录当前一共下载多少了

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2015-09-20 15:58  MrYude  阅读(175)  评论(0编辑  收藏  举报

导航