NSURLSession下载任务

作者: 狒狒James_Leo | 来源:发表于2016-08-10 21:04 被阅读0次

    <h1 >下载任务支持断点续传</h1>
    <h6>自己在storyboard中画来了3个button和一个进度条</h6>
    ps:注释已经很详细的写了怎么实现的
    <h2>

    //
    //  ViewController.m
    //  SessionDownload
    //
    //  Created by ios on 16/8/10.
    //  Copyright © 2016年 fenglei. All rights reserved.
    //
    
    #import "ViewController.h"
    
    @interface ViewController ()< NSURLSessionDownloadDelegate>{
      
        NSURLSessionDownloadTask *_task;//下载任务
        NSURLSession *_session; // 会话
        NSData *_didDownloadData;//已经下载的数据
    
    }
    
    //进度条
    @property (weak, nonatomic) IBOutlet UIProgressView *loadProgress;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.loadProgress.progress = 0;
        
     }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    //开始下载
    - (IBAction)startLoading:(id)sender {
        
        //获取一个url下载地址
        NSURL *url = [NSURL URLWithString:@"http://vf1.mtime.cn/Video/2012/04/23/mp4/120423212602431929.mp4"];
        
        //创建一个自定义的session
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
        
        //在主线程中创建一个会话(session)
         _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        
        //创建一个下载任务
        _task = [_session downloadTaskWithURL:url];
        
        //开始任务
        [_task resume];
        
        
        
    }
    
    //暂停
    - (IBAction)pause:(id)sender {
        
        //暂停任务
        [_task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
            
            _didDownloadData  = resumeData;
            NSLog(@"%@",resumeData); //resumeData是已经下载好的数据
            
            /*
               这里要将下载对象设置为nil,当暂停下载后这个对象如果要继续下载之前的文件要重新开辟一个下载对象。
               所以在这里把这个设置为nil,点击继续下载时重新用这个下载对象开辟一个下载任务
             
            */
            _task = nil;
        }];
        
    }
    
    //继续下载
    - (IBAction)continue:(id)sender {
        
        //继续之前的下载任务
        _task = [_session downloadTaskWithResumeData:_didDownloadData];
        //恢复下载任务
        [_task resume];
        
        
        
    }
    
    #pragma  mark - NSURLSessionDownloadDelegate method
    //下载完成
    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
    didFinishDownloadingToURL:(NSURL *)location{
       
        
        /*
          下载完成后系统会自动将数据保存到沙盒路径的temp文件夹下,
          temp文件夹为临时文件夹程序运行后会删除数据
          所以我们要将文件移动到沙盒路径下Documents文件下.
          loacation:文件下载后存放的路径
         */
        
        //创建一个沙盒文件路径
        NSString *str = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/movie.mp4"];
        
        NSURL *url = [NSURL fileURLWithPath:str];
        
        //创建文件管理对象
        NSFileManager *manger = [NSFileManager defaultManager];
        
        //将我们下载的数据从temp文件夹移动到Documents文件夹中
        [manger moveItemAtURL:location toURL:url error:nil];
        
        NSLog(@"%@",url);
        
        
        
        
    
    }
    
    //下载时会一直调用这个代理方法
    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
          didWriteData:(int64_t)bytesWritten
     totalBytesWritten:(int64_t)totalBytesWritten
    totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
        
        
        /*
         bytesWritten:本次下载传输的字节
         totalBytesWritten:已经下载的字节
         totalBytesExpectedToWrite:文件的总大小
         */
        
        //进度条
        float progress = totalBytesWritten/(float)totalBytesExpectedToWrite;
        
        self.loadProgress.progress = progress;
        
        
    }
    @end
    
    

    相关文章

      网友评论

        本文标题:NSURLSession下载任务

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