NSURLConnection与NSURLSession的区别

NSURLConnection在ios9.0之后被废弃,现在使用NSURLSession,两者相比,NSURLSession在以下几方面做了改进:

  1. 根据每个Session做配置(http header,Cache,Cookie,protocal,Credential),不再在整个App层面共享配置.
  2. 支持网络操作的取消和断点续传
  3. 丰富的Delegate模型
  4. 后台处理上传和下载,即使你点击了“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,可以将每个下载任务封装到一个任务模块中。

原文地址:https://www.cnblogs.com/xiangrikui/p/5267406.html