iOS-->通过Download类来实现文件断点下载

iOS-->通过Download类来实现文件断点下载_第1张图片
201406041133326.jpg

通过Download类来实现文件断点下载

除了使用文件句柄以及输出流之外,我们也可以通过download类来实现文件的断点下载,但是需要注意的是,它只能实现断点下载,是无法实现离线下载的。具体代码如下所示:

@interface ViewController ()
@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

你可能感兴趣的:(iOS-->通过Download类来实现文件断点下载)