NSURLSession实现断点下载
@interface HMViewController () <NSURLSessionDownloadDelegate, NSURLSessionDataDelegate]]>
- ( 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
{
}