NSURLConnection在ios9.0之后被废弃,现在使用NSURLSession,两者相比,NSURLSession在以下几方面做了改进:
- 根据每个Session做配置(http header,Cache,Cookie,protocal,Credential),不再在整个App层面共享配置.
- 支持网络操作的取消和断点续传
- 丰富的Delegate模型
- 后台处理上传和下载,即使你点击了“Home”按钮,后台仍然可以继续下载,并且提供了根据网络状况,电力情况进行处理的配置。
下面有一个断点续传的功能:
开始下载:
- (IBAction)startButton:(id)sender { //创建请求 //创建会话 //创建下载任务(初始下载) self.task = [[self session] downloadTaskWithRequest:[self request]]; [self.task resume]; }
暂停下载:
if (self.task) { //判断是否已经开始任务 [self.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) { self.partialData = resumeData; self.task = nil; }]; }
继续下载:
//当已经暂停下载的时候,点击恢复,开始下载 //是否已经开始下载任务,如果开始的话 如果初始下载 if (self.task) { NSLog(@"正在进行任务下载"); }else{ //之前已经开始下载 if (self.partialData) { self.task = [[self session] downloadTaskWithResumeData:self.partialData]; }else{ //之前还没有下载任务 self.task = [[self session] downloadTaskWithRequest:[self request]]; } [self.task resume]; }
下载的代理方法:
//正在下载
//正在下载 -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{ //下载代理方法里任务自动开辟子线程 NSLog(@"%@",[NSThread currentThread]); //刷新进度条 dispatch_async(dispatch_get_main_queue(), ^{ self.progress.progress = totalBytesWritten *1.0/totalBytesExpectedToWrite; }); }
//下载完成
//下载完成 -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{ //下载成功后,将下载内容从临时文件转到别的文件 //目的文件 NSFileManager *manager = [NSFileManager defaultManager]; NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; path = [path stringByAppendingPathComponent:[location lastPathComponent]]; NSURL *destination = [NSURL fileURLWithPath:path]; //转移 BOOL success = [manager moveItemAtURL:location toURL:destination error:nil]; //转移成功之后 if (success) { dispatch_async(dispatch_get_main_queue(), ^{ UIImage *image = [UIImage imageWithContentsOfFile:path]; self.imageView.image = image; }); } self.task = nil; }
思想:每个下载任务对应NSURLSession,可以将每个下载任务封装到一个任务模块中。