zoukankan      html  css  js  c++  java
  • ios开发网络学习十:利用文件句柄实现大文件下载

    #import "ViewController.h"
    
    @interface ViewController ()<NSURLSessionDataDelegate>
    @property (weak, nonatomic) IBOutlet UIProgressView *proessView;
    /** 接受响应体信息 */
    @property (nonatomic, strong) NSFileHandle *handle;
    @property (nonatomic, assign) NSInteger totalSize;
    @property (nonatomic, assign) NSInteger currentSize;
    @property (nonatomic, strong) NSString *fullPath;
    @end
    
    @implementation ViewController
    
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        //1.url
        NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_02.mp4"];
        
        //2.创建请求对象
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        //3.创建会话对象,设置代理
        /*
         第一个参数:配置信息 [NSURLSessionConfiguration defaultSessionConfiguration]
         第二个参数:代理
         第三个参数:设置代理方法在哪个线程中调用
         */
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        
        //4.创建Task
        NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
        
        //5.执行Task
        [dataTask resume];
    }
    
    #pragma mark ----------------------
    #pragma mark NSURLSessionDataDelegate
    /**
     *  1.接收到服务器的响应 它默认会取消该请求
     *
     *  @param session           会话对象
     *  @param dataTask          请求任务
     *  @param response          响应头信息
     *  @param completionHandler 回调 传给系统
     */
    -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
    {
        //获得文件的总大小
        self.totalSize = response.expectedContentLength;
        
        //获得文件全路径
        self.fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
        
        //创建空的文件
        [[NSFileManager defaultManager]createFileAtPath:self.fullPath contents:nil attributes:nil];
        
        //创建文件句柄
        self.handle = [NSFileHandle fileHandleForWritingAtPath:self.fullPath];
        
        [self.handle seekToEndOfFile];
        /*
         NSURLSessionResponseCancel = 0,取消 默认
         NSURLSessionResponseAllow = 1, 接收
         NSURLSessionResponseBecomeDownload = 2, 变成下载任务
         NSURLSessionResponseBecomeStream        变成流
         */
        completionHandler(NSURLSessionResponseAllow);
    }
    
    /**
     *  接收到服务器返回的数据 调用多次
     *
     *  @param session           会话对象
     *  @param dataTask          请求任务
     *  @param data              本次下载的数据
     */
    -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
    {
        
        //写入数据到文件
        [self.handle writeData:data];
        
        //计算文件的下载进度
        self.currentSize += data.length;
        NSLog(@"%f",1.0 * self.currentSize / self.totalSize);
        
        self.proessView.progress = 1.0 * self.currentSize / self.totalSize;
    }
    
    /**
     *  请求结束或者是失败的时候调用
     *
     *  @param session           会话对象
     *  @param dataTask          请求任务
     *  @param error             错误信息
     */
    -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
    {
        NSLog(@"%@",self.fullPath);
        
        //关闭文件句柄
        [self.handle closeFile];
        self.handle = nil;
    }
    
    
    @end
  • 相关阅读:
    PHP实现无限极分类
    html2canvas生成并下载图片
    一次线上问题引发的过程回顾和思考,以更换两台服务器结束
    Intellij IDEA启动项目报Command line is too long. Shorten command line for XXXApplication or also for
    mq 消费消息 与发送消息传参问题
    idea 创建不了 java 文件
    Java switch 中如何使用枚举?
    Collections排序
    在idea 设置 git 的用户名
    mongodb添加字段和创建自增主键
  • 原文地址:https://www.cnblogs.com/cqb-learner/p/5863126.html
Copyright © 2011-2022 走看看