• NSURLSession中的downloadTask的使用


    1.用downloadTask下载图片

    优点:简单

    缺点:不能监听下载的进度

    代码示例:

        NSURL *url = [NSURL URLWithString:@"http://pic1.win4000.com/pic/b/03/21691230681.jpg"];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        NSURLSession *session = [NSURLSession sharedSession];
        NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
           //默认把数据写到磁盘中:tmp/...随时可能被删除
            NSLog(@"location= %@", location);
            
            //转移文件
            NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)  lastObject];
            NSString *filePath = [cache stringByAppendingPathComponent:response.suggestedFilename];
            NSLog(@"filePath = %@",filePath);
            NSURL *toURL = [NSURL fileURLWithPath:filePath];
            [[NSFileManager defaultManager] moveItemAtURL:location toURL:toURL error:nil];
        }];
        [downloadTask resume];

    2.downloadTask下载比较大的文件

    优点:已经解决内存飚升的问题

    缺点:无法实现断点下载的功能

    代码如下:

    #import "ViewController.h"
    
    @interface ViewController ()<NSURLSessionDownloadDelegate>
    
    @property (nonatomic,strong) NSURLSession *session;
    @property (nonatomic,strong) NSURLSessionDownloadTask *downloadTask;
    @property (nonatomic,strong) NSData *resumeData ;
    
    @end
    
    @implementation ViewController
    
    - (IBAction)startClick:(id)sender {
        
        [self.downloadTask resume];
    }
    
    - (IBAction)suspendClick:(id)sender {
        [self.downloadTask suspend];
    }
    
    - (IBAction)cancleClick:(id)sender {
        //用cancel的方法,操作不可以恢复
    //    [self.downloadTask cancel];
        
        //取消,可以恢复的取消操作
        //resumeDta可以用来恢复下载的数据
        [self.downloadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
            //data不是沙盒中已经下载好的数据
            self.resumeData = resumeData;
        }];
        
        self.downloadTask = nil;
    }
    
    - (IBAction)resumeClick:(id)sender {
        //在恢复下载的时候,判断是否可以用来进行恢复下载的数据,如果有那么就根据该数据创建一个新的网络请求
        if (self.resumeData) {
            //取消 再恢复,在恢复的时候,需要重新创建
            self.downloadTask = [self.session downloadTaskWithResumeData:self.resumeData];
        }
        [self.downloadTask resume];
    }
    
    - (NSURLSession *)session {
        if (!_session) {
            _session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        }
        return _session;
    }
    
    - (NSURLSessionDownloadTask *)downloadTask {
        if (!_downloadTask) {
            NSURL *url = [NSURL URLWithString:@"http://meiye-mbs.oss-cn-shenzhen.aliyuncs.com/mbsFiles/0e3d0e4a0d5d4da5963e9e7617e8de101565841097849.mp4"];
            NSURLRequest *request = [NSURLRequest requestWithURL:url];
            _downloadTask = [self.session downloadTaskWithRequest:request];
        }
        return _downloadTask;
    }
    
    #pragma mark - 代理
    //01 写数据的时候调用
    /**
     bytesWritten:本次写入的数据大小
     totalBytesWritten:写入数据的总大小
     totalBytesExpectedToWrite:文件的总大小
     */
    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
        NSLog(@"111111=%f", 1.0 * totalBytesWritten / totalBytesExpectedToWrite);
    }
    
    //02 下载完成的时候调用
    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
        //转移文件
        NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)  lastObject];
        NSString *filePath = [cache stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
        NSLog(@"filePath = %@",filePath);
        NSURL *toURL = [NSURL fileURLWithPath:filePath];
        [[NSFileManager defaultManager] moveItemAtURL:location toURL:toURL error:nil];
    }
    
    //03  整个请求结束或者失败的时候调用
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
        NSLog(@"结束");
    }
    @end
  • 相关阅读:
    机器学习——线性回归
    系统课程
    C++——数据结构之链表
    PHP检测json格式数据
    如何搭建git服务器
    ucenter通信实现同步登录、同步退出(详细)
    获取ip地址
    JQuery对象与DOM对象的区别与转换
    php导出数据到csv文件
    [转载]php中sleep,flush,ob_flush函数介绍
  • 原文地址:https://www.cnblogs.com/lyz0925/p/11599726.html
Copyright © 2020-2023  润新知