博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
断点下载
阅读量:5221 次
发布时间:2019-06-14

本文共 3551 字,大约阅读时间需要 11 分钟。

演示效果如下:

 

利用NSURLSession实现断点下载

 

1.属性

@interface ViewController ()
/** 下载任务 */@property (nonatomic,strong) NSURLSessionDownloadTask *task;/** 上次的下载信息 */@property (nonatomic,strong) NSData *resumeData;/** session */@property (nonatomic,strong) NSURLSession *session;@end

 

2.初始化属性

 

- (NSURLSession *)session {    if (!_session) {        _session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];    }    return _session;}- (NSData *)resumeData {    //第一次访问resumeData加载沙盒中的resumeData    if (!_resumeData) {        NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];                NSString *file = [caches stringByAppendingPathComponent:@"data"];        _resumeData = [NSData dataWithContentsOfFile:file];    }    return _resumeData;}

 

3.实现点击事件

 

/** * 开始下载 */- (IBAction)start:(id)sender {        //获得下载任务    self.task = [self.session downloadTaskWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_02.mp4"]];        //启动任务    [self.task resume];}/** * 暂停下载 */- (IBAction)pause:(id)sender {    //一旦这个task被取消了,就无法再恢复    //data里面存储着上次的下载信息    [self.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {        self.resumeData = resumeData;                //可以将resumeData放到沙盒中        NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];                NSString *file = [caches stringByAppendingPathComponent:@"data"];        [resumeData writeToFile:file atomically:YES];    }];}/** * 继续下载 */- (IBAction)goOn:(id)sender {    self.task = [self.session downloadTaskWithResumeData:self.resumeData];    [self.task resume];}

 

4.实现代理方法

 

#pragma mark -
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes { NSLog(@"%s",__func__);}/** * 每当写入数据到临时文件中时,就会调用一次 * totalBytesExpectedToWrite:总大小 * totalBytesWritten:已经写入的大小 * bytesWritten 这次写入大小 */- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { NSLog(@"%s",__func__); NSLog(@"------%f",1.0*totalBytesWritten/totalBytesExpectedToWrite);}/** * 下载完毕就会调用一次这个方法 */- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { NSLog(@"%s",__func__); //文件将来存放的真实路径 NSString *file = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadTask.response.suggestedFilename]; //剪切location的临时文件到真实路径 NSFileManager *manager = [NSFileManager defaultManager]; [manager moveItemAtURL:location toURL:[NSURL fileURLWithPath:file] error:nil];}- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { NSLog(@"%s",__func__);

    //保存恢复数据

    self.resumeData = error.userInfo[NSURLSessionDownloadTaskResumeData];

}

 

怎么实现的断点下载?

resumeData里面保存了上次下载的信息

/**

 * 请求这个路径

 * 设置请求头 

 * Range: 0-100

 * [[NSMutableURLRequest requestWithURL:nil] setValue:@"0-1024" forHTTPHeaderField:@"Range"];

 * 通过设置Range这个请求头可以控制下载哪一部分的信息

 */

这些在resumeData都帮你做好了

 

转载于:https://www.cnblogs.com/langji/p/5373615.html

你可能感兴趣的文章
poj1936---subsequence(判断子串)
查看>>
黑马程序员_Java基础枚举类型
查看>>
[ python ] 练习作业 - 2
查看>>
一位90后程序员的自述:如何从年薪3w到30w!
查看>>
在.net core上使用Entity FramWork(Db first)
查看>>
System.Net.WebException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集...
查看>>
UIImage 和 iOS 图片压缩UIImage / UIImageVIew
查看>>
MongoDB的数据库、集合的基本操作
查看>>
ajax向后台传递数组
查看>>
疯狂JAVA16课之对象与内存控制
查看>>
[转载]树、森林和二叉树的转换
查看>>
WPF移动Window窗体(鼠标点击左键移动窗体自定义行为)
查看>>
软件测试-----Graph Coverage作业
查看>>
django ORM创建数据库方法
查看>>
创建Oracle synonym 详解
查看>>
php7 新特性整理
查看>>
RabbitMQ、Redis、Memcache、SQLAlchemy
查看>>
linux查看端口占用
查看>>
hdu - 1226 超级密码 (bfs)
查看>>
Sql常见面试题 受用了
查看>>