iOS开发-NSURLSessionDownloadTask文件下载(不设置代理)

关于下载问题,在前面讲解NSURLConnection实现文件下载时,使用block回调我们会遇到内存猛增以及无法获取下载进度的问题,最终、我们可以通过设置代理来获取进度信息和边下边写数据来解决以上问题。iOS 9以后,苹果弃用NSURLConnection发起网络请求,取而代之的是NSURLSession。NSURLSession中的相应方法已经做到了边下边写数据。这篇我们先说一说通过block回调来实现文件下载的方法:

注意:
与CAAnimation、NSOperation一样,NSURLSessionTask也是抽象类,不具备操作的能力,使用过程中只能使用其子类:


iOS开发-NSURLSessionDownloadTask文件下载(不设置代理)_第1张图片
NSURLSessionTask.png

NSURLSessionDownloadTask回调实现文件下载

//优点:不需要担心内存
//缺点:无法监听文件下载进度
-(void)download
{
    //1.url
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_03.png"];
    
    //2.创建请求对象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    //3.创建session
    NSURLSession *session = [NSURLSession sharedSession];
    
    //4.创建Task
    /*
     第一个参数:请求对象
     第二个参数:completionHandler 回调
        location:临时存放路径 NSURL类型,遵循file://协议
        response:响应头信息
        error:错误信息
     */
    //该方法内部已经实现了边接受数据边写沙盒(tmp)的操作
    NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
       
        //6.处理数据  block所在线程为子线程
        NSLog(@"%@---%@",location,[NSThread currentThread]);
        
        //6.1 拼接文件全路径 : 保存在tmp目录下得文件随时都回被删除,因此需要移动文件
        NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
        
        //6.2 剪切文件
        [[NSFileManager defaultManager]moveItemAtURL:location toURL:[NSURL fileURLWithPath:fullPath] error:nil];
        NSLog(@"%@",fullPath);
    }];
    
    //5.执行Task
    [downloadTask resume];
}

你可能感兴趣的:(iOS开发-NSURLSessionDownloadTask文件下载(不设置代理))