码迷,mamicode.com
首页 > Web开发 > 详细

NSURLSession实现断点下载

时间:2014-12-08 12:22:43      阅读:270      评论:0      收藏:0      [点我收藏+]

标签: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
{
   
}

NSURLSession实现断点下载

标签:nsurlsession实现断点下载

原文地址:http://blog.csdn.net/itcontend/article/details/41801969

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!