iOS NSURLSession的使用


使用NSURLSession发起的网络请求都当成任务,分为三种任务:

  • NSURLSessionDataTask: 基本数据请求任务
  • NSURLSessionDownloadTask: 下载任务,支持后台下载和暂停续传
  • NSURLSessionUploadTask: 上传任务,支持后台上传和暂停续传

所有的任务都是有Session发起的,默认所有的任务都是"挂起"的,需要resume才会执行

dataTask基本数据请求

    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/data.json"];
    //1.创建全局单例
    NSURLSession *session = [NSURLSession sharedSession];
    //2.所有的任务由session发起
    NSURLSessionTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        //3.反序列化,json数据
        id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        
        NSLog(@"%@",result);
    }];
    //4.启动任务
    [task resume];

downLoadTask下载任务

- (NSURLSession *)session {
    if (!_session) {
        //config 提供了一个全局的网络环境配置,包括:身份验证,浏览器类型,cookie,缓存,超时...
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
        _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
    }
    return _session;
}
     NSURL *url = [NSURL URLWithString:@"http://sw.bos.baidu.com/sw-search-sp/software/84d6cbfd4a092/QQ_mac_6.1.1.dmg"];
   
    //downloadTask下载
    //如果需要跟进下载进度progress,不能使用Block回调方式
    [[self.session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //文件路径,存在temp文件夹中
        NSLog(@"%@",location);
        //下载zip包解压缩操作
        //......
    }] resume];

注意: 如果在回调Block方法中,不做任何处理,下载的文件放在temp文件夹里,马上会自动删除,系统自动回收这块区域! 设计的目的是什么?
- 通常从网络上下载文件,什么格式文件最多 -> zip 文件最多!可以替用户节约流量!
- 如果是 zip 包,下载之后,需要解压
- 解压缩之后,原始的 zip 文件就不在需要了.系统会自动帮我们删除!

跟进下载进度,需要实现NSURLSessionDownloadDelegate代理方法

NSURL *url = [NSURL URLWithString:@"http://sw.bos.baidu.com/sw-search-sp/software/84d6cbfd4a092/QQ_mac_6.1.1.dmg"];
    //注意:如果要跟进下载进度,不能使用Block回调方式,负责代理方法不执行
[[self.session downloadTaskWithURL:url] resume];
/// MARK: - NSURLSessionDownloadDelegate代理
//iOS 7.0以前,三个方法都必须时间
//1.下载完成方法 iOS 8.0以后 这个方法必须实现
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
    
    NSLog(@"%@",location);
}

//2.下载进度监听方法
/**
 bytesWritten 本次下载的字节数
 totalBytesWritten 已经下载的字节数
 totalBytesExpectedToWrite 文件的总大小
 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
    
    //下载进度
    float progress = (float)totalBytesWritten/totalBytesExpectedToWrite;
    NSLog(@"%f",progress);
    //主线程刷新UI
    dispatch_async(dispatch_get_main_queue(), ^{
        //NSLog(@"%@",[NSThread currentThread]);
        self.progressLabel.text = [NSString stringWithFormat:@"%0.0f%%",progress * 100];
        self.progressView.progress = progress;
    });
    
}

//3.下载续传
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{
    
}

续传任务

//开始下载
- (IBAction)start:(id)sender {

    NSURL *url = [NSURL URLWithString:@"http://sw.bos.baidu.com/sw-search-sp/software/84d6cbfd4a092/QQ_mac_6.1.1.dmg"];
    //downloadTask下载
    self.downLoadTask = [self.session downloadTaskWithURL:url];
    [self.downLoadTask resume];
}

//暂停
- (IBAction)stop:(id)sender {
    NSLog(@"暂停");
    [self.downLoadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
        //resumeData  续传数据
        NSLog(@"下载数据的长度:%lu",resumeData.length);
        self.resumeData = resumeData;
        //释放下载任务
        self.downLoadTask = nil;
    }];
}

//继续
- (IBAction)resume:(id)sender {
    if (self.resumeData == nil) {
        NSLog(@"没有暂停的任务");
        return;
    }
    
    //续传下载任务
    self.downLoadTask = [self.session downloadTaskWithResumeData:self.resumeData];
    //重新开启任务
    [self.downLoadTask resume];
    //清空续传数据
    self.resumeData = nil;
}
代码链接

你可能感兴趣的:(iOS NSURLSession的使用)