zoukankan      html  css  js  c++  java
  • NSURLSession下载

    #import "HMViewController.h"
    
    @interface HMViewController () <NSURLSessionDownloadDelegate>
    
    @end
    
    @implementation HMViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    }
    
    // 任务:任何请求都是一个任务
    // NSURLSessionDataTask : 普通的GETPOST请求
    // NSURLSessionDownloadTask : 文件下载
    // NSURLSessionUploadTask : 文件上传
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        [self downloadTask2];
    }
    
    - (void)downloadTask2
    {
        NSURLSessionConfiguration *cfg = [NSURLSessionConfiguration defaultSessionConfiguration];
        
        // 1.得到session对象
        NSURLSession *session = [NSURLSession sessionWithConfiguration:cfg delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        
        // 2.创建一个下载task
        NSURL *url = [NSURL URLWithString:@"http://localhost/test.mp4"];
        NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url];
        
        // 3.开始任务
        [task resume];
        
        // 如果给下载任务设置了completionHandler这个block,也实现了下载的代理方法,优先执行block
    }
    
    #pragma mark - NSURLSessionDownloadDelegate
    /**
     *  下载完毕后调用
     *
     *  @param location     临时文件的路径(下载好的文件)
     */
    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
    {
        // location : 临时文件的路径(下载好的文件)tmp下面
        
        NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
        // response.suggestedFilename : 建议使用的文件名,一般跟服务器端的文件名一致
        
    
        NSString *file = [caches stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
        
    //    NSFileManager *mg = [NSFileManager defaultManager];
        
        // 将临时文件剪切或者复制Caches文件夹
        NSFileManager *mgr = [NSFileManager defaultManager];
        
        // AtPath : 剪切前的文件路径
        // ToPath : 剪切后的文件路径
        [mgr moveItemAtPath:location.path toPath:file error:nil];
    }
    
    /**
     *  恢复下载时调用
     */
    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
    {
    
    }
    
    
    /**
     *  每当下载完(写完)一部分时就会调用(可能会被调用多次)
     *
     *  @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
    {
        double progress = (double)totalBytesWritten / totalBytesExpectedToWrite;
        NSLog(@"下载进度---%f", progress);
    }
    
    #pragma mark ------------------------------------------------------------------
    /**
     *  下载任务:不能看到下载进度
     */
    - (void)downloadTask
    {
        // 1.得到session对象
        NSURLSession *session = [NSURLSession sharedSession];
        
        // 2.创建一个下载task
        NSURL *url = [NSURL URLWithString:@"http://localhost/test.mp4"];
        NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
            // location : 临时文件的路径(下载好的文件)
            
            NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
            // response.suggestedFilename : 建议使用的文件名,一般跟服务器端的文件名一致
            NSString *file = [caches stringByAppendingPathComponent:response.suggestedFilename];
            
            // 将临时文件剪切或者复制Caches文件夹
            NSFileManager *mgr = [NSFileManager defaultManager];
            
            // AtPath : 剪切前的文件路径
            // ToPath : 剪切后的文件路径
            [mgr moveItemAtPath:location.path toPath:file error:nil];
        }];
        
        // 3.开始任务
        [task resume];
    }
    
    - (void)dataTask
    {
        // 1.得到session对象
        NSURLSession *session = [NSURLSession sharedSession];
        
        // 2.创建一个task,任务----GET方式
        //    NSURL *url = [NSURL URLWithString:@"http://localhost/video"];
        //    NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        //        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
        //        NSLog(@"----%@", dict);
        //    }];
        
        NSURL *url = [NSURL URLWithString:@"http://192.168.15.172/login"];
        
        // 创建一个请求----POST方式
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        request.HTTPMethod = @"POST"; 
        // 设置请求体
        request.HTTPBody = [@"username=123&pwd=123" dataUsingEncoding:NSUTF8StringEncoding];
        
        NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
            NSLog(@"----%@", dict);
        }];
        
        // 3.开始任务
        [task resume];
    }
    
    @end
  • 相关阅读:
    Android的数据存储
    Servlet第一天
    JavaScript高级程序设计读书笔记(3)
    Interesting Papers on Face Recognition
    Researchers Study Ear Biometrics
    IIS 发生意外错误 0x8ffe2740
    Father of fractal geometry, Benoit Mandelbrot has passed away
    Computer vision scientist David Mumford wins National Medal of Science
    Pattern Recognition Review Papers
    盒模型bug的解决方法
  • 原文地址:https://www.cnblogs.com/521it/p/4983070.html
Copyright © 2011-2022 走看看