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;
}
代码链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容