文档章节

NSUrlSessionDataTask断点下载

xiaobai1315
 xiaobai1315
发布于 2016/09/21 17:18
字数 445
阅读 5
收藏 0

 实现思路:利用NSUrlSessionDataTask代理方法下载数据,接收到数据后里面写到文件里面。重新下载时通过设置response的range请求特定长度范围的数据;

@interface ViewController ()<NSURLSessionDataDelegate>
@property (strong, nonatomic) IBOutlet UIProgressView *progressView;

- (IBAction)pause:(id)sender;
- (IBAction)start:(id)sender;
- (IBAction)stop:(id)sender;
@property(nonatomic, strong)NSMutableData *totalData;

@property(nonatomic, strong)NSOutputStream *stream;

@property(nonatomic, strong)NSURLSessionDataTask *task;

@property(nonatomic, strong)NSData *data;

@property(nonatomic, strong)NSURLSession *session;

@property(nonatomic, assign)long long fileLength;   //文件总长度

@property(nonatomic, assign)long long receiveLength;    //接收到数据长度

@property(nonatomic, strong)NSString *fileName;



@end

@implementation ViewController

- (void)viewDidLoad {
    
    
    
}

-(NSData *)data{
    if(_data == nil){
        _data = [NSData data];
    }
    
    return _data;
}

-(NSMutableData *)totalData
{
    if(_totalData  == nil){
        _totalData = [NSMutableData data];
    }
    
    return _totalData;
}

//文件流
-(NSOutputStream *)stream
{
    if(_stream == nil){
        
        NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
        
        NSString *filePaht = [path stringByAppendingPathComponent:filename];
        
        NSLog(@"%@", filePaht);
        
        //创建追加方式的文件流
        _stream = [NSOutputStream outputStreamWithURL:[NSURL fileURLWithPath:filePaht] append:YES];
        
        [_stream open];
        
    }
    
    return _stream;
}

-(NSURLSessionDataTask *)task
{
    if(_task == nil){
        
        self.receiveLength = [self getCurrent];
        
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
        
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:vide0]];
        //请求特定长度范围的数据
        NSString *header = [NSString stringWithFormat:@"bytes=%zd-", self.receiveLength];
        
        NSLog(@"%@", header);
        
        [request setValue:header forHTTPHeaderField:@"Range"];
        
        _task = [session dataTaskWithRequest:request];
    }
    
    return _task;
}

//获取缓存目录下数据长度
-(NSInteger)getCurrent
{
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    
    NSString *filePaht = [path stringByAppendingPathComponent:filename];
    
    NSData *data = [NSData dataWithContentsOfFile:filePaht];
    
    NSInteger length = data.length;
    
    return length;
}

//开始、继续下载
- (IBAction)start:(id)sender {
    
    [self.task resume];
}

//暂停
- (IBAction)pause:(id)sender {
    
    [self.task suspend];

}


//停止
- (IBAction)stop:(id)sender {
    
    [self.task cancel];
    
}


-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
    //写文件
    [self.stream write:data.bytes maxLength:data.length];
    
    self.receiveLength += data.length;      //当前接收到的数据长度
    
     //更新UI
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        
        CGFloat pro = 1.0 * self.receiveLength / self.fileLength;
        
        NSLog(@"%lf", pro);
        
        self.progressView.progress = pro;
    }];
    
}


//接收到服务器响应调用
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
   // 获取文件总长度,可能已经下载了一部分,需要加上已经下载文件的长度
    self.fileLength = response.expectedContentLength + [self getCurrent];
    
    NSLog(@"%zd", self.fileLength);
    
    completionHandler(NSURLSessionResponseAllow);
    
}

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    NSLog(@"didComplete");
    
    [self.stream close];
}

 

© 著作权归作者所有

xiaobai1315
粉丝 3
博文 210
码字总数 73252
作品 0
程序员
私信 提问
NSUrlSession简单使用

NSURLSessionTask是一个抽象子类,它有三个具体的子类是可以直接使用的:NSURLSessionDataTask,NSURLSessionUploadTask和NSURLSessionDownloadTask。 NSURLSessionDataTask...

xiaobai1315
2016/09/21
3
0
开发只懂 AFN ?搞定 NSURLSession 才是硬道理

由于傲娇的苹果在 iOS9 之后已经放弃了 NSURLConnection,所以在现在的实际开发中,除了大家常见的 AFN 框架,一般使用的是 iOS7 之后推出的 NSURLSession,作为一名 iOS 开发人员,如果你只...

秦无炎
2016/10/20
13
0
AFNetWorking 实现文件的下载 断点续传

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

w_sen
2016/11/28
450
0
文件下载管理器包--TYDownloadManager

TYDownloadManager是一个iOS的文件下载管理器包,可以提示下载过程中的最新进展和状态的变化。 特性 TYDownLoadDataManager封装了NSURLSessionDataTask TYDownloadSessionManager封装了NSURL...

匿名
2016/06/29
526
0
AFN经典报错bug(三)

AFN经典报错bug(三) 1. 报错如下: [NSURL length]: unrecognized selector sent to instance 0x7fcbb2e72440 2.打全局断点 锁定到 NSMutableURLRequest *request = [self.requestSerializer......

swallowYan
2016/04/24
46
0

没有更多内容

加载失败,请刷新页面

加载更多

ngrok 外网映射工具

ngrok介绍 许多刚学java web的同学(包括我自己)肯定都非常好奇,如何在外网上访问自己做的项目,跟我们本地访问tomcat有什么区别? 今天就向大家介绍一个非常强大的外网映射工具:ngrok.ngrok可以...

edison_kwok
41分钟前
2
0
Spark Streaming的优化之路——从Receiver到Direct模式

          作者:个推数据研发工程师 学长 1 业务背景 随着大数据的快速发展,业务场景越来越复杂,离线式的批处理框架MapReduce已经不能满足业务,大量的场景需要实时的数据处理结果来...

个推
今天
4
0
壮丽70年·奋斗新时代|蒸妙集团熏蒸中会阴熏蒸的神奇好处

聚结相合之处为会。会阴居两阴间,为督、任、冲三脉的起点,三脉背出两阴之间,会聚阴部,因名会阴。会阴,经穴名。出《针灸甲乙经》。会阴别名屏翳、下极、金门。属任脉。在会阴部,男性当阴...

公益传承
今天
2
0
pentaho-kettle-8.2.0.0-R源码开发环境搭建

1.从Kettle官网下载源码,本文使用的是pentaho-kettle-8.2.0.0-R 下载地址:https://codeload.github.com/pentaho/pentaho-kettle/zip/8.2.0.0-R 2.打开eclipse,选择一个新的工作空间,然后设...

gq_2010
今天
1
0
lua web快速开发指南(7) - 高效的接口调用 - httpc库

httpc库基于cf框架都内部实现的socket编写的http client库. httpc库内置SSL支持, 在不使用代理的情况下就可以请求第三方接口. httpc支持header、args、body、timeout请求设置, 完美支持各种h...

水果糖的小铺子
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部