通过Download类来实现文件断点下载
除了使用文件句柄以及输出流之外,我们也可以通过download类来实现文件的断点下载,但是需要注意的是,它只能实现断点下载,是无法实现离线下载的。具体代码如下所示:
@interface ViewController ()<NSURLSessionDownloadDelegate>
@property (nonatomic, strong) NSURLSessionDownloadTask *downloadTask;
@property (nonatomic, strong) NSData *resumeData;
@property (nonatomic, strong)NSURLSession *session;
@end
@implementation ViewController
-(NSURLSession *)session
{
if (_session == nil) {
_session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
}
return _session;
}
-(NSURLSessionDownloadTask *)downloadTask
{
if (_downloadTask == nil) {
//01 确定请求路径
NSURL *url = [NSURL URLWithString:@"http://32812/resources/videos/minion_01.mp4"];
//02 创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//03 创建会话对象 设置代理
//04 创建请求任务
_downloadTask = [self.session downloadTaskWithRequest:request];
}
return _downloadTask;
}
//开始
- (IBAction)startBtnClick:(id)sender
{
[self.downloadTask resume];
NSLog(@"开始");
}
//暂停
- (IBAction)suspendBtnClick:(id)sender
{
[self.downloadTask suspend];
}
//取消
- (IBAction)cancelBtnClick:(id)sender
{
//取消 该取消方法是不能恢复下载
//[self.downloadTask cancel];
NSLog(@"取消---");
//该取消方法是可以恢复的
[self.downloadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
self.resumeData = resumeData;
}];
}
//恢复
- (IBAction)resumeBtnClick:(id)sender
{
//判断是暂停之后恢复还是取消之后恢复
if (self.resumeData) {
//根据可恢复下载的数据来重新创建网络请求
self.downloadTask = [self.session downloadTaskWithResumeData:self.resumeData];
self.resumeData = nil;
}
[self.downloadTask resume];
}
#pragma mark NSURLSessionDownloadDelegate
//01 写数据的时候调用该方法
/*
bytesWritten :本次写入数据的大小
totalBytesWritten:写入数据的总大小
totalBytesExpectedToWrite:文件的总大小
*/
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
//计算文件的下载进度
NSLog(@"%f",1.0 * totalBytesWritten / totalBytesExpectedToWrite);
}
//02 当下载完成之后会调用
/*
location:文件的临时存储路径
*/
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
//剪切文件到caches
//剪切文件到安全的位置
NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
//执行文件剪切操作
[[NSFileManager defaultManager] moveItemAtURL:location toURL:[NSURL fileURLWithPath:fullPath] error:nil];
NSLog(@"%@",fullPath);
}
//03 请求结束的时候调用
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"didCompleteWithError--%@",error);
}
@end