NSURLSession实现断点下载

NSURLSession实现断点下载

@interface HMViewController () <NSURLSessionDownloadDelegate, NSURLSessionDataDelegate]]>

@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
- (
IBAction)download:(UIButton *)sender;

@property (nonatomic, strong) NSURLSessionDownloadTask *task;
@property (nonatomic, strong) NSData *resumeData;
@property (nonatomic, strong) NSURLSession *session;
@end

@implementation HMViewController

- (
NSURLSession *)session
{
   
if (!_session) {
       
// 获得session
       
NSURLSessionConfiguration *cfg = [NSURLSessionConfiguration defaultSessionConfiguration];
       
self.session = [NSURLSession sessionWithConfiguration:cfg delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    }
   
return _session;
}

- (
IBAction)download:(UIButton *)sender {
   
// 按钮状态取反
    sender.
selected = !sender.isSelected;
   
   
if (self.task == nil) { // 开始(继续)下载
       
if (self.resumeData) { // 恢复
            [
self resume];
        }
else { // 开始
            [
self start];
        }
    }
else { // 暂停
        [
self pause];
    }
}

/**
 * 
从零开始
 */

- (
void)start
{
   
// 1.创建一个下载任务
   
NSURL *url = [NSURL URLWithString:@"http://192.168.15.172:8080/MJServer/resources/videos/minion_01.mp4"];
   
self.task = [self.session downloadTaskWithURL:url];
   
   
// 2.开始任务
    [
self.task resume];
}

/**
 * 
恢复(继续)
 */

- (
void)resume
{
   
// 传入上次暂停下载返回的数据,就可以恢复下载
   
self.task = [self.session downloadTaskWithResumeData:self.resumeData];
   
   
// 开始任务
    [
self.task resume];
   
   
// 清空
   
self.resumeData = nil;
}

/**
 * 
暂停
 */

- (
void)pause
{
   
__weak typeof(self) vc = self;
    [
self.task cancelByProducingResumeData:^(NSData *resumeData) {
       
//  resumeData : 包含了继续下载的开始位置\下载的url
        vc.
resumeData = resumeData;
        vc.
task = nil;
    }];
}

#pragma mark - NSURLSessionDownloadDelegate
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(
NSURL *)location
{
   
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
   
// response.suggestedFilename 建议使用的文件名,一般跟服务器端的文件名一致
   
NSString *file = [caches stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
   
   
// 将临时文件剪切或者复制Caches文件夹
   
NSFileManager *mgr = [NSFileManager defaultManager];
   
   
// AtPath : 剪切前的文件路径
   
// ToPath : 剪切后的文件路径
    [mgr
moveItemAtPath:location.path toPath:file error:nil];
}

- (
void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didWriteData:(
int64_t)bytesWritten
 totalBytesWritten:(
int64_t)totalBytesWritten
totalBytesExpectedToWrite:(
int64_t)totalBytesExpectedToWrite
{
   
NSLog(@"获得下载进度--%@", [NSThread currentThread]);
   
// 获得下载进度
   
self.progressView.progress = (double)totalBytesWritten / totalBytesExpectedToWrite;
}

- (
void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
 didResumeAtOffset:(
int64_t)fileOffset
expectedTotalBytes:(
int64_t)expectedTotalBytes
{
   
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。