#import "ViewController.h"
@interface ViewController () <NSURLSessionDataDelegate, NSURLSessionDownloadDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *imgView;
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
/** 下载任务的属性 */
@property (nonatomic, strong) NSURLSessionDownloadTask *task;
/** 网络请求类 */
@property (nonatomic, strong) NSURLSession *session;
/** 发送请求类 */
@property (nonatomic, strong) NSURLRequest *request;
/** 保存已经下载的数据,供继续下载使用 */
@property (nonatomic, strong) NSMutableData *data;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 设置progress的初始值
self.progressView.progress = 0;
}
#pragma mark - 开始下载
- (IBAction)start:(id)sender {
// 下载的url
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com/img/bdlogo.png"];
// 初始化请求类
self.request = [NSURLRequest requestWithURL:url];
// 创建NSURLSession
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
self.session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
// 下载请求任务
self.task = [self.session downloadTaskWithRequest:self.request];
// 开启
[self.task resume];
}
#pragma mark - 暂停下载
- (IBAction)pause:(id)sender {
if (self.task) {
__weak typeof(self)weakSelf = self;
// 暂停并保存之前已经下载的内容
[self.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
weakSelf.data = [NSMutableData dataWithData:resumeData];
}];
}
// 暂停任务
[self.task suspend];
}
#pragma mark - 继续下载
- (IBAction)continue:(id)sender {
// 判断当前有没有任务,是发送请求,还是处理数据
if (self.task != nil) {
// 说明已经下载,这里要处理的就是数据
self.task = [self.session downloadTaskWithResumeData:self.data];
} else {
// 此时没有下载任何内容,应该重新发送请求进行下载
self.task = [self.session downloadTaskWithRequest:self.request];
}
// 启动
[self.task resume];
}
#pragma mark - 代理方法
// 下载完成的方法
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
[fileManager moveItemAtPath:location.path toPath:path error:nil];
self.imgView.image = [UIImage imageWithContentsOfFile:path];
}
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
// 下载当前段的数据
NSLog(@"bytesWritten = %lld", bytesWritten);
// 已经下载的总数据量
NSLog(@"totalBytesWritten = %lld", totalBytesWritten);
// 总进度
NSLog(@"totalBytesExpectedToWrite = %lld", totalBytesExpectedToWrite);
// 设置progress的进度值
self.progressView.progress = (CGFloat)totalBytesWritten / (CGFloat)totalBytesExpectedToWrite;
}
@end