95 NSURLSession 断点续传

来源:互联网 发布:天金加银软件下载 编辑:程序博客网 时间:2024/05/01 18:19
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;}- (void)viewDidLoad{    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.}- (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 *)downloadTaskdidFinishDownloadingToURL:(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)totalBytesWrittentotalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{    NSLog(@"获得下载进度--%@", [NSThread currentThread]);    // 获得下载进度    self.progressView.progress = (double)totalBytesWritten / totalBytesExpectedToWrite;}- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffsetexpectedTotalBytes:(int64_t)expectedTotalBytes{}
0 0