NSURLSession下载(断点续传)

//
//  ViewController.m
#import "ViewController.h"


@interface ViewController ()<NSURLSessionDownloadDelegate>

/**下载任务*/
@property(nonatomic,strong)NSURLSessionDownloadTask *downloadTask;

/**全局管理的会话*/
@property(nonatomic,strong)NSURLSession *session;

/**续传的数据*/
@property(nonatomic,strong)NSData *resumeData;

@end

@implementation ViewController

- (NSURLSession *)session
{
    if (_session == nil) {
        
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];

        _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
    }
    return _session;
}

/**继续*/
- (IBAction)resume:(id)sender
{
    if (self.resumeData == nil) {
        NSLog(@"没有续传的数据");
        return;
    }
    
    // 使用上一次的记录,新建一个下载任务
    self.downloadTask =  [self.session downloadTaskWithResumeData:self.resumeData];
    
    // 一旦任务建立完成,之前的续传数据没有用,释放掉
    self.resumeData = nil;
    
    [self.downloadTask resume];
}

/**暂停*/
- (IBAction)pause:(id)sender
{
    NSLog(@"%s", __func__);
    
    [self.downloadTask cancelByProducingResumeData:^(NSData *resumeData) {
        
        NSLog(@"=----%tu", resumeData.length);
        
        // 保存起来暂停的时候的字节数
        self.resumeData = resumeData;
        
        // 释放下载任务
        self.downloadTask = nil;
    }];
}

- (IBAction)start {
    
    // 1. url
    NSString *urlStr = @"http://127.0.0.1/01-课程概述.mp4";
    urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    NSURL *url = [NSURL URLWithString:urlStr];
    
    // 2. 通过session对象 开始一个任务
    self.downloadTask = [self.session downloadTaskWithURL:url];
   
    // 继续
    [self.downloadTask resume];
}

#pragma mark - NSURLSessionDownloadDelegate
// 1. 下载完成被调用的方法  iOS 7 & iOS 8都必须实现
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
    NSLog(@"下载完成..");
    
    self.downloadTask = nil;
}

// 2. 下载进度变化的时候被调用的。 iOS 8可以不实现
/**
 bytesWritten:     本次写入的字节数
 totalBytesWritten:已经写入的字节数(目前下载的字节数)
 totalBytesExpectedToWrite: 总的下载字节数(文件的总大小)
 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
    float progress = (float)totalBytesWritten / totalBytesExpectedToWrite;
    NSLog(@"%f---%@", progress, [NSThread currentThread]);
}

// 3. 断点续传的时候,被调用的。一般什么都不用写 iOS 8可以不实现
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
{
    
}


@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值