• 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
  • 相关阅读:
    MAC配置DNS服务器
    真机IOS8.3以上的文件夹共享
    appium + python的环境配置_windows
    python 的时间与日期
    sublimetext 2 编译文件带input时 提示 EOFError: EOF when reading a line
    cmd无法输入中文解决方案
    配置python学习环境遇到的问题:[Decode error
    monkey初接触
    Android logcat输出中文乱码
    运行 命令框不记录打过的命令,重启后CMD里面是空的.上次打过的命令消失了.
  • 原文地址:https://www.cnblogs.com/521it/p/4983070.html
Copyright © 2020-2023  润新知