美文网首页
网络编程(07)NSURLSession 代理强引用的问题

网络编程(07)NSURLSession 代理强引用的问题

作者: Rui哥 | 来源:发表于2018-05-25 13:10 被阅读76次

    方式一

    /缺点:无法监听文件的进度
    -(void)downloadTaskDownLoadFile{
         //01 确定资源路径
        NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/abc.jpeg"];
        //02 创建请求对象
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        //03 创建会话对象
        NSURLSession *session = [NSURLSession sharedSession];
        
        //04 创建downloadTask
        /* 参数说明
         * location:位置 文件的位置 ,默认已经把数据写到磁盘中:tmp/...随时可能被删除
         * response:响应头信息
         */
        NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request
                                                                completionHandler:^(NSURL *  location,                          NSURLResponse *  response,
                                                                                    NSError * error) {
            
            
            NSLog(@"%@",location);
            
            //转移文件(转移到安全的地方去)
            NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
            NSString *fullPath = [cachePath stringByAppendingPathComponent:response.suggestedFilename];
           
            // 文件下载完成后将文件移动到需要保存的地方 
            [[NSFileManager defaultManager] moveItemAtURL:location toURL:[NSURL fileURLWithPath:fullPath] error:nil];
        }];
        
        //05 发送请求
        [downloadTask resume];
    
    }
    

    方式二 代理方式下载文件

    发送数据请求

    -(void)downloadTaskDownLoadFile
    {
         //01 确定资源路径
        NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/abc.jpeg"];
        
        //02 创建请求对象
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        //03 创建会话对象 设置代理
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        
        //04 创建downloadTask
        NSURLSessionDownloadTask *downloadTask =[session downloadTaskWithRequest:request];
        
        //05 发送请求
        [downloadTask resume];
    
    }
    

    处理代理 NSURLSessionDownloadDelegate

    • 01 写数据的时候调用
    -(void)URLSession:(NSURLSession *)session
         downloadTask:(NSURLSessionDownloadTask *)downloadTask
         didWriteData:(int64_t)bytesWritten //本次写入的数据大小
    totalBytesWritten:(int64_t)totalBytesWritten //写入数据的总大小
    totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite //文件的总大小
    {
        NSLog(@"%f",1.0 * totalBytesWritten / totalBytesExpectedToWrite);
    }
    
    • 02 下载完成的时候调用
    -(void)URLSession:(NSURLSession *)session
         downloadTask:(NSURLSessionDownloadTask *)downloadTask
    didFinishDownloadingToURL:(NSURL *)location
    {
        //转移文件(转移到安全的地方去)
        NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
        NSString *fullPath = [cachePath stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
        
        //剪切文件
        [[NSFileManager defaultManager] moveItemAtURL:location toURL:[NSURL fileURLWithPath:fullPath] error:nil];
        
        NSLog(@"%@",fullPath);
    
    }
    
    • 03 整个请求结束或者是失败的时候调用
    -(void)URLSession:(NSURLSession *)session
                 task:(NSURLSessionTask *)task
    didCompleteWithError:(NSError *)error
    {
        NSLog(@"didCompleteWithError");
    }
    

    三 总结

    • 介绍下NSURLSessionTask的几个子类
     1> NSURLSessionTask 是个抽象类,如果要使用只能使用它的子类
     2> NSURLSessionTask 有两个子类:
        >一个是NSURLSessionDataTask,该task 可以用来处理一般的网络请求,如GET和PSOT请求.
        >一个是NSURLSessionDownloadTask ,该task在处理文件下载时有很大的优势,不需要做文件的拼接写入功能.确定不能实现离线断点下载
     3> NSURLSessionDataTask 有一个子类,为NSURLSessionUploadTask,该请求在处理文件上传是很有优势.
    
    • 如和处理Session对代理的强引用的
     调用session 的2个方法 (一般是在将要消失控制器时调用)
     1> 1个是终止请求
     2> 2个是请求完成后自动结束
    
    • 在使用NSURLSessionDataTask断点下载文件的要点是什么?
     1> 在请求文件时确保设置请求头信息 Range 范围. @"bytes=起始位置-长度" //起始位置和长度其中有一个可以不要,中间不能有空格
     2> 从响应头中获取 正确的文件下载总长度.
     3> 文件句柄在最开始写入文件时要保证移动到了文件的末尾
     4> 文件写完后,需要关闭文件句柄
    

    相关文章

      网友评论

          本文标题:网络编程(07)NSURLSession 代理强引用的问题

          本文链接:https://www.haomeiwen.com/subject/gxxwfftx.html