什么叫离线断点下载,就是用户下载中关闭程序重新打开可以继续下载

代码实现如下:

#import "ViewController.h"
@interface ViewController ()<NSURLSessionDataDelegate>
//输出流
@property (nonatomic, strong) NSOutputStream *stream ;
//Task对象
@property (nonatomic, strong) NSURLSessionDataTask *dataTask;
//文件总大小
@property (nonatomic, assign) NSInteger totalSize;
//文件当前已下载大小
@property (nonatomic, assign) NSInteger currentSize;
//文件的全路径
@property (nonatomic, strong) NSString *fullPath
//会话对象
@property (nonatomic, strong) NSURLSession *session;
@end@implementation ViewController
//懒加载会话对象
-(NSURLSession *)session
{if (_session == nil) {//3.创建会话对象/*第一个参数:配置信息第二个参数:代理  self第三个参数:代理方法的队列*/NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];_session = session;}return _session;
}
//懒加载task
-(NSURLSessionDataTask *)dataTask
{if (_dataTask == nil) {//1.确定请求路径NSString *urlStr = @"http://120.25.226.186:32812/resources/videos/minion_01.mp4";NSURL *url = [NSURL URLWithString:urlStr];//2.创建请求对象NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];NSString *fileName = [urlStr lastPathComponent];NSInteger curentSize = [self getCurrentLength:fileName];//记录当前已下载的大小self.currentSize = curentSize;//设置请求头,表示下一次下载从哪个地方开始下载NSString *range = [NSString stringWithFormat:@"bytes=%zd-",curentSize];[request setValue:range forHTTPHeaderField:@"Range"];//4.创建taskNSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request];_dataTask = dataTask;}return _dataTask;
}-(void)dealloc
{//释放session 俩种方法任选一种
    [self.session invalidateAndCancel];
//    [self.session resetWithCompletionHandler:nil];
}//开始下载
- (IBAction)startBtnClick:(id)sender
{[self.dataTask resume];
}
//暂停下载
- (IBAction)suspendBtnClick:(id)sender
{[self.dataTask suspend];
}
//继续下载
- (IBAction)goOnBtnClick:(id)sender
{[self.dataTask resume];
}
//得到当前下载进度
-(NSInteger)getCurrentLength:(NSString *)fileName
{self.fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:fileName];NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:self.fullPath error:nil];NSLog(@"%@",dict);//获取文件已下载大小NSInteger size = [dict[@"NSFileSize"] integerValue];return size;
}
#pragma mark - NSURLSessionDataDelegate
//1.接收到服务器响应的时候
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{//expectedContentLength:本次请求的数据的大小self.totalSize = response.expectedContentLength + self.currentSize;//创建输出流NSOutputStream *stream = [[NSOutputStream alloc]initToFileAtPath:self.fullPath append:YES];//打开流
    [stream open];self.stream = stream;//通过该回调告诉系统是否要继续接收服务器返回给我们的数据NSURLSessionResponseAllow==接收
    completionHandler(NSURLSessionResponseAllow);
}
//2.接收到服务器返回数据的时候调用,会调用多次
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{NSLog(@"didReceiveData---%zd",data.length);[self.stream write:data.bytes maxLength:data.length];self.currentSize +=data.length;//打印下载进度NSLog(@"%f",1.0 * self.currentSize / self.totalSize);
}//3.请求结束的时候调用(成功|失败),如果失败那么error有值
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{NSLog(@"didCompleteWithError---%@",[NSThread currentThread]);//关闭流
    [self.stream close];self.stream = nil;
}
@end

转载于:https://www.cnblogs.com/liugengqun/p/5140141.html

iOS网络-NSURLSessionDataTask大文件离线断点下载相关推荐

  1. Java实现FTP批量大文件上传下载

    用Java实现FTP批量大文件上传下载 <iframe id="I0_1416224567509" style="margin: 0px; padding: 0px ...

  2. C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收 ...

  3. HTML5 批量大文件上传下载

    前言 文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上 ...

  4. 浏览器 批量大文件上传下载

    本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...

  5. java多线程下载文件(断点下载、进度展示、网速展示)

    引言 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销. 多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的. 一个线程可以创建和撤销另一个线程:同一个进程中的多个线程之间可 ...

  6. 音乐(文件)断点下载

    这篇文章介绍音乐等文件的下载,支持断点续传. 我们需要创建两个类 HYDownLoader:音乐下载的主类,可以进行新建下载.暂停下载.取消下载等. HYFileTool:文件管理类,主要为HYDow ...

  7. python下载大文件-python requests 下载大文件不完整

    目前我有一个脚本, 从帝联的 CDN 外链获取一下文件作为备份. 使用的是 Python 2.7.10 requests 2.8.1 目前碰到一个情况, 使用 requests 下载大文件的时候会出现 ...

  8. 快速传输大文件,怎么通过网络传大文件给对方(1G以上)

    在生活和工作中,我们总是要发送一些比较大的文件给别人,或者在自己的设备之间.在互联网日益发达的今天,我们可以用什么方法通过互联网快速传输大文件,发送1G以上的文件? 一.使用QQ传 在电脑上打开QQ, ...

  9. python批量下载网页文件-超简单超详细python小文件、大文件、批量下载教程

    按照不同的情况,python下载文件可以分为三种: 小文件下载 大文件下载 批量下载 python 小文件下载 流程:使用request.get请求链接,返回的内容放置到变量r中,然后将r写入到你想放 ...

最新文章

  1. Kotlin for Android
  2. kernel 自定义字符驱动 第一次实验
  3. 直播预告 | 小米人工智能部崔世起:小爱同学全双工技术实践
  4. docker+mysql创建用户名密码_docker构建私有仓库并设置仓库用户和密码
  5. 使控件大小随窗口变化
  6. PLSQL_PLSQL读和写XML文件方式(案例)
  7. 关于部分手机无法搜索到5G wifi信号的解决方法
  8. Nginx源码分析 - 基础数据结构篇 - hash表结构 ngx_hash.c(07)
  9. C#控制台应用程序执行结果一闪而过的解决方法
  10. 石家庄地铁售票系统进度(田智凯,高泽伟)
  11. 基于 SLS 构建 RDS 审计合规监控
  12. CRX 4 Chrome
  13. 什么是SOL注入攻击?Land攻击?Ping of Death攻击?Teardrop攻击?
  14. 2-Druid 系统框架
  15. [转载]别让用户发呆—设计中的防呆策略
  16. html字重怎么设置,CSS 字重 font-weight
  17. 安卓电子书格式_[技巧] 无敌的boss级电子书阅读app,全能高手就要一个打十个。...
  18. 爬取素材网的妹子图片
  19. python Django项目点击run或debug时出现Type ‘manage.py help <subcommand>‘ for help on a specific subcommand.
  20. 用正则表达式求非负整数 、匹配正整数、非正整数、负整数、整数、非负浮点数、正浮点数、非正浮点数、负浮点数、浮点数、有数字26个英文字母组成的字符串

热门文章

  1. Android应用程序消息处理机制(Looper、Handler)分析(2)
  2. Excel数字、文本混合列导入SQL Server出现的问题&解决办法
  3. SQLI DUMB SERIES-5
  4. codility上的问题 (22)
  5. python+selenium百度贴吧自动签到
  6. SpringMVC 处理multipart形式数据:java方式配置文件上传
  7. 整数展示分数和整形数的四则运算
  8. 在LinearLayout中嵌套RelativeLayout来设置Button的位置(xml文件)
  9. Python基础14-迭代器与生成器
  10. python字典{:4}_Python字典101:详细的视觉介绍