zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Best Time to Buy and Sell Stock III
    Valid Palindrome
    Longest Substring Without Repeating Characters
    Copy List with Random Pointer
    Add Two Numbers
    Recover Binary Search Tree
    Anagrams
    ZigZag Conversion
    Merge k Sorted Lists
    Distinct Subsequences
  • 原文地址:https://www.cnblogs.com/dashengios/p/10559629.html
Copyright © 2011-2022 走看看