zoukankan      html  css  js  c++  java
  • NSURLSessionDataDelegate 文件下载

    #import "ViewController.h"

    #define FileName @"121212.mp4"

     

    @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;

    @property (nonatomic, strongNSURLSessionDataTask *dataTask;

    @property (nonatomic, strong) NSURLSession *session;

     

    @end

     

    @implementation ViewController

     

    -(void)viewDidLoad

    {

        [super viewDidLoad];

        

        //1.读取保存的文件总大小的数据,0

        //2.获得当前已经下载的数据的大小

        //3.计算得到进度信息

        

    }

    -(NSString *)fullPath

    {

        if (_fullPath == nil) {

            

            //获得文件全路径

            _fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:FileName];

        }

        return _fullPath;

    }

     

    -(NSURLSession *)session

    {

        if (_session == nil) {

            //3.创建会话对象,设置代理

            /*

             第一个参数:配置信息 [NSURLSessionConfiguration defaultSessionConfiguration]

             第二个参数:代理

             第三个参数:设置代理方法在哪个线程中调用

             */

            _session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

        }

        return _session;

    }

    -(NSURLSessionDataTask *)dataTask

    {

        if (_dataTask == nil) {

            //1.url

            NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"];

            

            //2.创建请求对象s

            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

            

            //3 设置请求头信息,告诉服务器请求那一部分数据

            self.currentSize = [self getFileSize];

            NSString *range = [NSString stringWithFormat:@"bytes=%zd-",self.currentSize];

            [request setValue:range forHTTPHeaderField:@"Range"];

            

            //4.创建Task

            _dataTask = [self.session dataTaskWithRequest:request];

        }

        return _dataTask;

    }

     

    -(NSInteger)getFileSize

    {

        //获得指定文件路径对应文件的数据大小

        NSDictionary *fileInfoDict = [[NSFileManager defaultManager]attributesOfItemAtPath:self.fullPath error:nil];

        NSLog(@"%@",fileInfoDict);

        NSInteger currentSize = [fileInfoDict[@"NSFileSize"] integerValue];

        

        return currentSize;

    }

    - (IBAction)startBtnClick:(id)sender

    {

        [self.dataTask resume];

    }

     

    - (IBAction)suspendBtnClick:(id)sender

    {

        NSLog(@"_________________________suspend");

        [self.dataTask suspend];

    }

     

    //注意:dataTask的取消是不可以恢复的

    - (IBAction)cancelBtnClick:(id)sender

    {

          NSLog(@"_________________________cancel");

        [self.dataTask cancel];

        self.dataTask = nil;

    }

     

    - (IBAction)goOnBtnClick:(id)sender

    {

          NSLog(@"_________________________resume");

        [self.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

    {

        //获得文件的总大小

        //expectedContentLength 本次请求的数据大小

        self.totalSize = response.expectedContentLength + self.currentSize;

        

        if (self.currentSize == 0) {

            //创建空的文件

            [[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;

    }

     

    -(void)dealloc

    {

        //清理工作

        //finishTasksAndInvalidate

        [self.session invalidateAndCancel];

    }

     

    @end

  • 相关阅读:
    二维ST表模板
    AtCoder Beginner Contest 151 *F
    [Codeforces Round #320 (Div. 2) -E. Weakness and Poorness (三分/二分)
    [Codeforces Round #320 (Div. 2) C. A Problem about Polyline (数学)
    [Codeforces Round #630 (Div. 2)]
    Codeforces Round #353 (Div. 2) E. Trains and Statistic (线段树 + dp)
    Educational Codeforces Round 13 D. Iterated Linear Function (矩阵快速幂)
    Codeforces Round #260 (Div. 1) A. Boredom (简单dp)
    Codeforces Round #245 (Div. 1) B. Working out (简单DP)
    POJ 1988 Cube Stacking (带权并查集)
  • 原文地址:https://www.cnblogs.com/liuzhenjie/p/5480169.html
Copyright © 2011-2022 走看看