开发者社区> 珲yy少> 正文

iOS网络编程之二——NSURLSession的简单使用

简介: iOS网络编程之二——NSURLSession的简单使用
+关注继续查看


一、NSURLSession简介


   在iOS7之后,NSURLSession作为系统推荐使用的HTTP请求框架,在进行前台请求的情况下,NSURLSession与NSURLConnection并无太大差异,对于后台的请求,NSURLSession更加灵活的优势就将展现无遗。


       1.NSURLSession集合的类型


       NSURLSession类提供3中Session类型:


       Default类型:提供前台请求相关方法,支持配置缓存,身份凭证等。


       Ephemeral类型:即时的请求类型,不使用缓存,身份凭证等。


       Background:后台类型,支持在后台完成请求任务。


       2.NSURLSession任务的类型


       在NSURLSession中添加的请求任务支持3中类型:


       数据任务:使用NSData对象进行数据的发送和获取,一般用于短数据的任务。


       下载任务:从文件下载数据,支持后台下载。


       上传任务:以文件的形式上传数据,支持后台上传。


二、创建并配置NSURLSession


       通过NSURLSessionConfiguration类对象对NSURLSession进行配置与创建,创建和配NSURLSession的示例代码如下:


   //默认类型的

   NSURLSessionConfiguration * defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];

   //即时类型的

   NSURLSessionConfiguration * ephemeralConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration];

   //后台类型的

   NSURLSessionConfiguration * backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"SessionId"];

   

   //创建并设置session

   NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration:defaultConfiguration];

   NSURLSession * ephemeralSession = [NSURLSession sessionWithConfiguration:ephemeralConfiguration];

   NSURLSession * backgroundSession = [NSURLSession sessionWithConfiguration:backgroundConfiguration];

NSURLSessionConfiguration还可以配置如缓存,网络模式等参数


三、使用NSURLSession进行网络请求的两种方式


       NSURLSession有两种方式进行网络数据的请求,一种是通过block的方式获取网络数据,一种是通过代理回调的方式获取网络数据。通过block的方式进行请求代码如下:


   //创建session配置对象

   NSURLSessionConfiguration * defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];

   //创建请求对象

   NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];

   //创建session对象

   NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration:defaultConfiguration];

   //添加任务

   NSURLSessionTask * task= [defaultSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

       NSLog(@"%@",data);

   }];

   //开始任务

   [task resume];

使用代理回调的方式进行请求需要遵守如下协议:


@interface ViewController ()<NSURLSessionDataDelegate>

@end

将请求代码修改如下:


   NSURLSessionConfiguration * defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];

   NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];

   NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration:defaultConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];


   NSURLSessionTask * task= [defaultSession dataTaskWithRequest:request];

   [task resume];

实现代理方法如下:


//开始接受数据

-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{

   NSLog(@"=======%@",data);

}

//接受数据结束

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{

   NSLog(@"完成:error%@",error);

}

四、进行后台下载任务


       NSURLSession最大的优势在于其后台下载的灵活性,使用如下的代码进行后台数据下载:


NSURLSessionConfiguration * backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.zyprosoft.backgroundsession"];

   NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];

   NSURLSession *  backgroundSession   = [NSURLSession sessionWithConfiguration:backgroundConfiguration delegate:self delegateQueue:nil];

   [[backgroundSession downloadTaskWithRequest:request]resume];

在下面的回调方法中可以进行下载进度的监听:


- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite

{

   NSLog(@"######");

}

如果在下载过程中点击Home键使应用程序进入后台,NSURLSession的相关代理方法将不再被回调,但是下载任务依然在进行,当后台下载完成后会与AppDelegate进行交互,会调用AppDelegate中的如下方法:


-(void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler{

   NSLog(@"1111");

}

之后应用程序在后台会调用NSURLSesstion代理的如下方法来通知下载结果:


//此方法无论成功失败都会调用

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{

   NSLog(@"完成:error%@",error);

}

//此方法只有下载成功才会调用 文件放在location位置

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{

   

}

最后将调用NSURLSesstion的如下方法:


-(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session

{

   

   NSLog(@"All tasks are finished");

   }

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
iOS逆向 01:初识汇编
iOS逆向 01:初识汇编
5 0
Vue3 的 Reactive 响应式到底是什么
​Vue 3 除了令人钦佩的性能改进,还带来了一些新功能。可以说,最重要的介绍是 `Composition API` 。在本文的第一部分中,我们将概括 Vue3 创建新 API 的动机:即,更好的组织和重用代码。在第二部分中,我们将重点讨论使用新API时较少讨论的方面,例如响应式特性。我将响应式特性其称为按需响应。
10 0
Android 打包AAB+PAD(java篇)(下)
Play Core API 集成 安装时分发 快速跟进式分发和按需分发 查看状态 获取有关资源包的下载信息 安装 监控下载状态 下载内容较大 获取资源包 取消请求 移除资源包 获取多个资源包的位置 相关推荐 Android aab打包 Android App Bundle 已取代 APK
8 0
人人都能做游戏系列教程3(视频+图文版)
这是“人人都能做游戏”系列视频教程的第3节。这一节我将会带大家了熟悉一下将会使用的游戏制作工具,然后制作出第一个“你好,小游戏。”的事例,向小游戏开发世界问好。
8 0
微信小游戏开发实战11-使用本地缓存
这是微信小游戏开发实战系列的第11篇,点击上方的#微信小游戏开发实战话题可以查看本系列的所有内容。 本节主要内容:使用本地缓存来记录玩家的设置以及各种类型数据的本地缓存和读取操作。
6 0
微信小游戏开发实战15-关卡编辑器的制作以及关卡分享功能的实现
**微信小游戏开发实战系列的第15篇,点击上方的#微信小游戏开发实战话题可以查看本系列的所有内容。 本节主要内容有游戏中的关卡编辑器的实现思路以及如何利用分享功能将自己制作的关卡与好友分享。
4 0
Go 语言 第一课
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。 Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。
4 0
mybatis面试题大总结
Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,开发者开发时只需要关注如何编写SQL语句,可以严格控制sql执行性能,灵活度高。
4 0
R沟通|Typora字体颜色设置
前段时间小编给大家推荐了一个markdown的IDE编辑器:Typora,具体推文如下:R沟通|markdown编辑器—Typora 和 R沟通 | 如何在Typora中设置免费的图床。今天针对文字颜色变化做一个演示,主要参考知乎:演奇[1]的回答。
4 0
ArrayList这样回答还拿不到offer?
这是我实习的第二个月。今天讲述的是ArrayList。大家肯定对这个很熟悉,比如日常开发过程中,不管是前后端分离开发还是不分离开发,都会利用接口调用SQL语句查询数据。查询到的结果是存入ArrayList里的。问题来了!
3 0
+关注
596
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载