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");

   }

目录
相关文章
|
6月前
|
缓存 iOS开发
IOS网络编程:使用 URLSession 实现网络请求的步骤是什么?
IOS网络编程:使用 URLSession 实现网络请求的步骤是什么?
110 1
|
3月前
|
安全 网络安全 Android开发
安卓与iOS开发:选择的艺术网络安全与信息安全:漏洞、加密与意识的交织
【8月更文挑战第20天】在数字时代,安卓和iOS两大平台如同两座巍峨的山峰,分别占据着移动互联网的半壁江山。它们各自拥有独特的魅力和优势,吸引着无数开发者投身其中。本文将探讨这两个平台的特点、优势以及它们在移动应用开发中的地位,帮助读者更好地理解这两个平台的差异,并为那些正在面临选择的开发者提供一些启示。
127 56
|
6月前
|
移动开发 网络协议 安全
iOS审核在ipv6网络下无法访问服务器的问题及解决方案
iOS审核在ipv6网络下无法访问服务器的问题及解决方案
188 0
|
6月前
|
XML JSON API
IOS网络编程:介绍一下 Alamofire 库。
IOS网络编程:介绍一下 Alamofire 库。
163 3
|
6月前
|
缓存 JSON API
IOS网络编程:什么是 RESTful API?如何使用 RESTful 风格设计 API?
IOS网络编程:什么是 RESTful API?如何使用 RESTful 风格设计 API?
164 3
|
iOS开发
iOS开发 GET、POST请求方法:NSURLSession篇
iOS开发 GET、POST请求方法:NSURLSession篇
102 0
|
网络协议 安全 数据库
第二章TCP/IP—iOS网络七层模型
分层: 应用层 (Application): 网络服务与最终用户的一个接口。 协议有:HTTP FTP TFTP SMTP SNMP DNS 表示层(Presentation Layer): 数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层) 格式有,JPEG、ASCll、DECOIC、加密格式等 会话层(Session Layer): 建立、管理、终止会话。(在五层模型里面已经合并到了应用层) 对应主机进程,指本地主机与远程主机正在进行的会话 传输层 (Transport): 定义传输数据的协议端口号,以及流控和差错效验。
514 0
第二章TCP/IP—iOS网络七层模型
|
安全 定位技术 开发工具
IOS9中的一些网络配置
iOS9为了增强数据访问安全,将所有的http请求都改为了https,为了能够在iOS9中正常使用地图SDK,请在"Info.plist"中进行如下配置,否则影响SDK的使用。
72 0