利用 NSURLSession 实现文件下载,首先需要创建一个 NSURLSessionDownloadTask; 由于需要实时监听下载进度,所以,需要实现 <NSURLSessionDownloadDelegate>方法,这样,就需要自定义一个会话 session.并且制定代理.
// NSURLSession 下载的断点续传实现步骤:
1. 懒加载全局网络会话
{
-(NSURLSession *)session
{
if (!_session) {
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
}
return _session;
}
}
2. 利用全局网络会话,创建下载 task, 开始下载任务
{
self.task = [self.session downloadTaskWithURL:url];
[self.task resume];
}
3. 在代理方法中,实时监听下载进度
{
// 监听下载进度的方法
// bytesWritten :本次下载的字节数
// totalBytesWritten :已经下载的字节数
// totalBytesExpectedToWrite :下载文件的总字节数
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
NSLog(@"代理回调~");
float progress = (float)totalBytesWritten/totalBytesExpectedToWrite;
dispatch_async(dispatch_get_main_queue(), ^{
self.progress.progress = progress;
});
}
// 完成下载的时候调用
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
NSLog(@"下载完成%@",location);
}
// 断点续传的代理方法,暂时什么都不写
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
{
NSLog(@"%s",__FUNCTION__);
}
}
4. 当点击暂停之后,应该取消下载任务,记录当前下载的文件数据,并且将 task 任务设为 nil
{
[self.task cancelByProducingResumeData:^(NSData *resumeData) {
self.reusemData = resumeData;
self.task = nil;
}];
}
5. 当点击继续之后,应该从上次下载的进度继续下载,这时,重新创建下载 task, 并且是根据上次记录的文件下载数据来实例化下载任务
{
if (!self.reusemData) {
return;
}
self.task = [self.session downloadTaskWithResumeData:self.reusemData];
self.reusemData = nil;
[self.task resume];
}
}