• NSURLSession使用NSURLSessionDataTask实现大文件下载,使用NSFileHandle实现一边接收数据,一边存到沙盒


    NSURLSession实现大文件下载,使用NSFileHandle实现一边接收数据,一边存到沙盒

    //文件句柄(指针) NSFileHandle实现边接收边写数据到沙盒中

    /*

     特点:在写数据的时候边写数据边移动位置

     使用步骤:

     (1)创建空的文件

     (2)创建文件句柄指针指向该文件

     (3)当接收到数据的时候,使用该句柄来写数据

     (4)当所有的数据写完,应该关闭句柄指针

     

    #import "ViewController.h"
    
    @interface ViewController ()<NSURLSessionDataDelegate>
    
    @property (nonatomic, assign) NSInteger totalSize;  //文件的总大小
    @property (nonatomic, assign) NSInteger currentSize; //当前已经下载的数据大小
    @property (weak, nonatomic) IBOutlet UIProgressView *progressView;
    @property (nonatomic, strong) NSFileHandle *handle;
    @end
    
    @implementation ViewController
    
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        //01 确定资源路径
        NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"];
        
        //02 创建请求对象
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        //03 创建会话对象 设置代理
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        
        //04 创建下载请求Task
        NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
        
        //05 发送请求
        [dataTask resume];
    }
    
    #pragma mark -----------------------
    #pragma mark NSURLSessionDataDelegate
    //01 接收到响应的时候调用
    -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
    {
        //得到本次请求的文件数据大小
        self.totalSize = response.expectedContentLength;
        
        //0 拼接获取文件的存储路径
        //得到文件的名称:得到请求的响应头信息,获取响应头信息中推荐的文件名称
        NSString *fileName = [response suggestedFilename];
        
        NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
        
        //拼接文件的存储路径(沙盒路径cache) + 文件名
        NSString *fullPath = [cache stringByAppendingPathComponent:fileName];
    
        
        //(1)创建空的文件
        [[NSFileManager defaultManager] createFileAtPath:fullPath contents:nil attributes:nil];
        
        
        //(2)创建文件句柄指针指向该文件
        self.handle = [NSFileHandle fileHandleForWritingAtPath:fullPath];
        
        
        //告诉系统应该接收数据
        completionHandler(NSURLSessionResponseAllow);
    }
    
    //02 接收到服务器返回数据的时候调用 可能会调用多次
    -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
    {
        //(3)当接收到数据的时候,使用该句柄来写数据
        [self.handle writeData:data];
       
        //计算进度
        self.currentSize +=data.length;
        NSLog(@"%f",1.0 * self.currentSize / self.totalSize);
        self.progressView.progress = self.currentSize / self.totalSize;
    }
    
    //03 下载完成或者是失败的时候调用
    -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
    {
        // (4)当所有的数据写完,应该关闭句柄指针
        [self.handle closeFile];
    }
    
    //文件句柄(指针) NSFileHandle实现边接收边写数据到沙盒中
    /*
     特点:在写数据的时候边写数据边移动位置
     使用步骤:
     (1)创建空的文件
     (2)创建文件句柄指针指向该文件
     (3)当接收到数据的时候,使用该句柄来写数据
     (4)当所有的数据写完,应该关闭句柄指针
     
     */
    
    @end
  • 相关阅读:
    Asp.net 中 listbox 滚动条 定位 火麒
    Silverlight跨域访问WCF服务 火麒
    网页加载速度优化技巧
    很漂亮的login
    ireport
    方法1,定位,相当于四周受力
    方法2,平移
    大端小端数据存储方式
    c++中RTTI
    C语言细节数组a+1和&a+1
  • 原文地址:https://www.cnblogs.com/dashengios/p/10559629.html
Copyright © 2020-2023  润新知