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

201406041133326.jpg

通过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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,916评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,845评论 18 139
  • 一. iOS中发送HTTP请求的方案 在iOS中,我们常用发送HTTP请求的方案有苹果原生(自带)NSURLCon...
    xx_cc阅读 10,895评论 26 150
  • 我的孤独,生命最懂! 我之所以孤独,是因为我从没感觉到孤独! 一个人的孤独胜过一群人的狂欢。 一个人的一生最需要做...
    狼痞谷阅读 271评论 1 1
  • 这个周末的感动和较劲,是从食物开始的。 周六晚上回家已经6点多,一天没吃东西,饥肠辘辘。妈妈他们刚吃完饭。 刚进门...
    Janeshu阅读 278评论 0 1