• NSURLSession从网络上下载资源,此程序下载的是视频


    #import "ViewController.h"
    
    @interface ViewController ()<NSURLSessionDelegate, NSURLSessionDownloadDelegate>
    
    @property (weak, nonatomic) IBOutlet UIProgressView *progressView; //进度条
    @property(nonatomic, strong) NSURLSessionTask *downLoadTask; //下载任务
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        /*****************   SessionConfiguration会话配置   *****************/
        //1. 设置工作模式, 分为3种
        //defaultSessionConfiguration: 一般模式, 可以使用缓存的Cache, Cookie, 鉴权
        //ephemeralSessionConfiguration: 及时模式, 不使用缓存的Cache, Cookie, 鉴权
        //backgroundSessionConfigurationWithIdentifier: 后台模式, 完成上传下载, 需要给一个ID, 用于追踪完成工作的Session是哪一个(当程序切到后台, 这个任务也会继续下载)
        //一般模式
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    
        /*****************   URLSession网络设置   *****************/
        //2. 创建NSURLSession
        //粒度低
    //    NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
        //粒度高
        NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        //设置mainQueue就能在主线程进行回调非常的方便
        
    
        /*****************   URLRequest网址请求对象   *****************/
        NSURL *url = [NSURL URLWithString:@"http://hc25.aipai.com/user/656/20448656/6167672/card/25033081/card.mp4?l=a"];
        //3. 创建网址请求对象
        NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
        
        /*****************   会话任务   *****************/
        //4. 根据职能不同Task有三种
        // (1)NSURLSessionUploadTask: 上传用的Task, 传完以后不会再下载返回结果
        // (2)NSURLSessionDownloadTask: 下载用的Task
        // (3)NSURLSessionDataTask: 可以上传内容, 上传完成后再进行下载???????
    
        // 创建一个给定的请求下载任务
        self.downLoadTask = [session downloadTaskWithRequest:urlRequest];
        
        // 创建一个下载任务来下载给定的网址的内容
    //    self.downLoadTask = [session downloadTaskWithURL:url];
        // 创建 和 恢复数据的下载任务
    //    self.downLoadTask = [session2 downloadTaskWithResumeData:data];
    }
    
    #pragma mark 开始下载
    - (IBAction)startAction:(UIButton *)sender {
        //得到task后, 调用resume开始工作
        [self.downLoadTask resume];
    }
    
    #pragma mark 暂停下载
    - (IBAction)suspendAction:(UIButton *)sender {
        [self.downLoadTask suspend];
    }
    
    #pragma mark 恢复下载
    - (IBAction)resumeAction:(UIButton *)sender {
        [self.downLoadTask resume];
    }
    
    
    /*****************   NSURLSessionDownloadDelegate代理方法   *****************/
    #pragma mark 下载完成后调用的方法
    -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
        NSLog(@"下载存放的临时路径 = %@", location.path);
        
        //将下载好的.tmp缓存文件, 存成
        NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
        //创建新文件路径
        NSString *imagePath = [cachesPath stringByAppendingString:@"/image.mp4"];
        //文件管理器
        NSFileManager *fileManger = [NSFileManager defaultManager];
        //将下载号的缓存文件caches移动到新文件里
        [fileManger moveItemAtPath:location.path toPath:imagePath error:nil];
        NSLog(@"转存后的路径 = %@", imagePath);
    }
    
    /**
     *  每下载完一部分文件后就会触发的方法
     *
     *  @param session                   会话
     *  @param downloadTask              下载任务
     *  @param bytesWritten              下载速度
     *  @param totalBytesWritten         已经下载多少
     *  @param totalBytesExpectedToWrite 文件总大小
     */
    -(void)URLSession:(NSURLSession *)session
         downloadTask:(NSURLSessionDownloadTask *)downloadTask
         didWriteData:(int64_t)bytesWritten
    totalBytesWritten:(int64_t)totalBytesWritten
    totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
        
        NSLog(@"速度:%lld kb/s, 已经下载:%lldkb 总大小:%lldkb ", bytesWritten/1024, totalBytesWritten/1024, totalBytesExpectedToWrite/1024);
        
        //已经下载 / 总大小
        self.progressView.progress = (double)totalBytesWritten/totalBytesExpectedToWrite;
    }
    


  • 相关阅读:
    微服务架构
    SQL语句优化方法30例(转)
    Repeater后台取前台textbox值
    JAVAJDK环境变量的配置(转)
    [转]javascript把数字格式化转换成货币型
    改变ascx的pageLoad和页面的pageLoad执行顺序(转)
    关于在Webservice里使用LinqToSQL遇到一对多关系的父子表中子表需要ToList输出泛型而产生循环引用错误的解决办法!(转)
    兼容IE,FILEFOX的JS 全选(转)
    Android xml 布局(转)
    LINQ to SQL Transaction(转)
  • 原文地址:https://www.cnblogs.com/moxiaoyan33/p/5309255.html
Copyright © 2020-2023  润新知