1 @interface ViewController ()<NSURLSessionDataDelegate,NSURLSessionDownloadDelegate> 2 // 显示图片 3 @property (weak, nonatomic) IBOutlet UIImageView *imageView; 4 5 // 显示进度 6 @property (weak, nonatomic) IBOutlet UIProgressView *progressView; 7 8 // 下载任务的属性 9 @property (nonatomic, strong) NSURLSessionDownloadTask *task; 10 11 // 网络请求类 12 @property (nonatomic, strong) NSURLSession *session; 13 14 // 发送请求类 15 @property (nonatomic, strong) NSURLRequest *request; 16 17 // 用来保存已经下载的数据,供继续下载使用 18 @property (nonatomic, strong) NSMutableData *data; 19 20 @end 21 22 @implementation ViewController 23 24 - (void)viewDidLoad { 25 [super viewDidLoad]; 26 // Do any additional setup after loading the view, typically from a nib. 27 // 设置progressView开始值 28 self.progressView.progress = 0; 29 30 } 31 32 #pragma mark - 开始下载 33 - (IBAction)startDownload:(id)sender { 34 35 // 下载的url 36 NSString *urlStr = @"http://hc24.aipai.com/user/396/23170396/4799208/card/25053445/card.mp4?l=a"; 37 NSURL *url = [NSURL URLWithString:urlStr]; 38 39 // 初始化请求类 40 self.request = [NSURLRequest requestWithURL:url]; 41 42 // 创建NSURLSession 43 44 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 45 46 self.session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 47 // 下载请求任务 48 self.task = [self.session downloadTaskWithRequest:self.request]; 49 50 // 开启 51 [self.task resume]; 52 53 } 54 55 #pragma mark - 暂停 56 - (IBAction)pauseDownload:(id)sender { 57 58 // 暂停 59 if (self.task) { 60 // 暂停并保存之前已经下载的内容 61 62 __weak typeof (self)weakSelf = self; 63 [self.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) { 64 weakSelf.data = [NSMutableData dataWithData:resumeData]; 65 }]; 66 } 67 68 // 暂停任务 69 [self.task suspend]; 70 } 71 72 #pragma mark - 继续下载 73 - (IBAction)continueDownload:(id)sender { 74 75 // 判断当前任务是否有,是发送请求还是处理数据 76 if (self.task != nil) { 77 // 说明已经下载,这里要处理的就是数据 78 self.task = [self.session downloadTaskWithResumeData:self.data]; 79 } else { 80 // 此时没有下载任何内容,应该重新发送请求下载 81 self.task = [self.session downloadTaskWithRequest:self.request]; 82 83 } 84 85 // 启动任务 86 [self.task resume]; 87 } 88 89 #pragma mark - 代理方法 90 // 下载完成走的方法 91 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location 92 { 93 // 找到文件夹管理器 94 95 NSFileManager * fileManager = [NSFileManager defaultManager]; 96 // 先找到沙盒 97 NSArray *urlArray = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]; 98 NSLog(@"%@", urlArray); 99 // 根据沙盒路径获取Document路径 100 NSURL *url = [urlArray objectAtIndex:0]; 101 NSLog(@"%@", url); 102 // 根据系统推荐的类型去保存下载的url 103 NSURL *saveUrl = [url URLByAppendingPathComponent:downloadTask.response.suggestedFilename]; 104 NSLog(@"%@", saveUrl); 105 // 使用 106 self.imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:saveUrl]]; 107 108 } 109 110 - (void)URLSession:(NSURLSession *)session downloadTask:(nonnull NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite 111 { 112 // 下载当前段的数据 113 NSLog(@"bytesWritten = %lld", bytesWritten); 114 // 已经下载的总数据量 115 NSLog(@"totalBytesWritten = %lld", totalBytesWritten); 116 // 表示总进度 117 NSLog(@"totalBytesExpectedToWrite = %lld", totalBytesExpectedToWrite); 118 // 设置progressView的进度值 119 self.progressView.progress = (CGFloat)totalBytesWritten / (CGFloat)totalBytesExpectedToWrite; 120 } 121 122 - (void)didReceiveMemoryWarning { 123 [super didReceiveMemoryWarning]; 124 // Dispose of any resources that can be recreated. 125 }