文档章节

NSURLSessionDownloadTask实现断点下载,对下载任务进行暂停,取消,恢复

o
 osc_y8yehimr
发布于 2019/03/20 11:58
字数 428
阅读 12
收藏 0

精选30+云产品,助力企业轻松上云!>>>

NSURLSessionDownloadTask不能实现离线断点下载

因为该代理方法是直接将下载结果返回,而不是分步存储磁盘,因此离线断点下载可以使用NSURLSessionDataTask

#import "ViewController.h"

@interface ViewController ()<NSURLSessionDownloadDelegate>

@property(nonatomic,strong) NSURLSessionDownloadTask *downloadTask;
@property(nonatomic,strong) NSURLSession *session;
@property(nonatomic,strong) NSData  *fileInfoData;//取消下载时保存的数据

@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) {
        
        NSURL *url = [NSURL URLWithString:@"http://www.ytmp3.cn/down/59224.mp3"];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        _downloadTask = [self.session downloadTaskWithRequest:request];
    }
    return _downloadTask;
}

- (IBAction)startBtnClick:(UIButton *)sender {
    //开始
    NSLog(@"开始下载");
    [self.downloadTask resume];
    
}
- (IBAction)suspendBtnclick:(UIButton *)sender {
    //暂停
    [self.downloadTask suspend];
    NSLog(@"暂停下载");
}
- (IBAction)cancelBtnClick:(UIButton *)sender {
    
    //取消 , [self.downloadTask cancel]普通的取消是不能恢复的.
    //resumeData 可以用来恢复下载的数据
    [self.downloadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
        self.fileInfoData = resumeData;
    }];
    self.downloadTask = nil;//取消后 将downloadTask置空。
}
- (IBAction)resumeBtnClick:(UIButton *)sender {
    //恢复下载
    //如果已经取消了下载,需要拿到可恢复的数据重新创建下载任务
    if (self.fileInfoData.length > 0) {
        //根据可恢复数据重新创建一个新的downloadTask指针指向全局下载任务
        self.downloadTask = [self.session downloadTaskWithResumeData:self.fileInfoData];
        [_downloadTask resume];
        
    }else {
        [self.downloadTask resume];
    }
}

#pragma mark NSURLSessionDownloadDelegate
//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);
}

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{//下载完成调用
    
    NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    NSString *fullPath = [cachePath stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
    //将文件转移到安全的地方去
    [[NSFileManager defaultManager]moveItemAtURL:location toURL:[NSURL fileURLWithPath:fullPath] error:nil];
    
    NSLog(@"----%@",fullPath);
}

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{//整个请求完成或者请求失败调用
    
    NSLog(@"didCompleteWithError");
}
@end

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
iOS开发之网络编程--2、NSURLSessionDownloadTask文件下载

本文内容大纲: 1、回顾NSURLSessionTask 2、NSURLSessionDownloadTask大文件之block下载 3、NSURLSessionDownloadTask大文件之代理方法下载 4、NSURLSessionDownloadTask大文件之代理方法实...

何阳234
2016/03/11
7
0
iOS开发之网络编程--2、NSURLSessionDownloadTask文件下载

本文内容大纲: 1、回顾NSURLSessionTask 2、NSURLSessionDownloadTask大文件之block下载 3、NSURLSessionDownloadTask大文件之代理方法下载 4、NSURLSessionDownloadTask大文件之代理方法实...

何阳234
2016/03/11
4
0
ios 后台下载,断点续传总结

2018年12月05日 16:09:00 weixin34101784 阅读数:5 https://blog.csdn.net/weixin_34101784/article/details/87569604 断点续传 demo demog.gif 断点续传的原理是在HTTP1.1协议(RFC2616)中......

osc_xucwolsl
2019/03/13
2
0
AFNetWorking 实现文件的下载 断点续传

最近用到了下载,网上也搜寻过下载方面的东西,没有找到太合适的关于AFNetWorking 3.x方面的断点续传的介绍或者demo,于是自己写吧。AFURLSessionManager这个封装了上传、下载方面的相关内容...

w_sen
2016/11/28
778
0
iOS 下载URL不断改变的情况下 使用 resumeData做断点续传

Apple 在 iOS 7 之后将原有的 NSURLConnection 替换成了新的 NSURLSession ,新的 NSURLSession 包含诸多新的特性,其中有一项就是在应用退出到后台以及崩溃后,系统可以继续帮我们进行上传、...

卢叁
2017/10/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Saga分布式事务框架

1优点 1、避免服务之间的循环依赖,因为saga协调器会调用saga参与者,但参与者不会调用协调器 2、集中分布式事务编排 3、降低参与者的复杂性 4、回滚更容易管理 Saga模式的一大优势是它支持长...

战略板儿砖
40分钟前
11
0
为什么要使用static_cast (x)而不是(int)x? - Why use static_cast(x) instead of (int)x?

问题: I've heard that the static_cast function should be preferred to C-style or simple function-style casting. 我听说static_cast函数应该比C样式或简单的函数样式转换更可取。 Is......

fyin1314
42分钟前
16
0
最难的几道Java面试题,看看你跪在第几个?

这是我收集的10个最棘手的Java面试问题列表。这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题。你可能知道这些棘手的 Java 问题的答案,或者觉得这些不足以挑战你的 Java 知识,但...

码农突围
43分钟前
13
0
浅谈Spring核心技术 IOC与AOP

IOC: IOC(Inversion Of Controll,控制反转)是一种设计思想,将原本在程序中手动创建对象的控制权,交由给Spring框架来管理。IOC容器是Spring用来实现IOC的载体,IOC容器实际上就是一个M...

创业789
44分钟前
13
0
智能金融丨神州信息助某省联社实现一体化智能运维建设

近日,由神州信息实施的某省联社“IT服务管理平台项目”顺利通过验收,并获得客户的高度认可。该项目是神州信息在农信领域打造的又一标杆项目,为客户实现了IT运维流程标准化及运维系统一体化...

脉脉小达人
46分钟前
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部