ios urlsession html,ios NSURLSession简介

iOS7 中我们可以使用NSURLSession类来进行URL请求。如果是更早之前的版本使用NSURLConnection,在此之前先看下ios中关于URL的一些相关类。

be7779ae025b088d37829dea17e11bd5.png

URLLoading部分是我们主要使用的类,其它五个是帮助类。涉及各个方面。协议支持,加密,cookie管理,缓存,配置。

NSURLSession中的任务的行为依赖于三件事:session的类型(由传入的configuration对象来决定),task的类型,当task创建时应用是否处于前台。

Session的类型

1. 默认session使用diskcache并将证书保存在用户keychain中。

2. 短暂session没有将任何数据存在disk上,所有相关的东西都在ram中,当session无效时,这些内容自动被清除。

3.后台session,和默认session类似,除了独立一个进程来处理所有的数据传送。还有些限制。

Task的类型

在一个session中,NSURLSession支持三种任务类型:data tasks, download tasks, upload tasks

data task: 使用NSData来发送和接收数据,适用于频繁的,数据量很小的交互。可以在数据到达时将数据发送给应用,或是在数据接收完成时,回调。

download task:以文件的形式接收数据。并且当app没有运行时,支持后台下载。

upload task:发送数据(通常以文件的形式)。并且当app没有运行时,支持后台上传。

创建并配置一个session

NSURLSession提供了很多的配置选项:

指明存储cache, cookies, credentials的位置

auth,和一个特殊的request(task)关联,或是一组的request(session)

文件的上传和下载,从metadata 中分离。

每个host的最大连接数。

每个resource的超时时间,

最小和最大的TLS版本支持

自定义proxy 字典

控制cookie 策略

控制http pipelining行为

因为大部分设置都包含在独立的配置对象中,你可以重新使用配置。当你实例化一个session object时,你指明了:

一个配置对象来管理session和task的行为。

可选的,一个委托对象来处理incoming data 当接收到数据时并处理session和task的其它事件。例如服务端鉴权,决定i一个resource load是否被转化成download,等等。

如果你没有提供一个委托,NSURLSession使用系统提供的。在这种情况下,你可以欣然的使用NSURLSession的 方法。

注意:如果你的app需要执行后台传输,就必须提供一个自定义的委托。

在你实例化seesion对象后,你不能改变配置或者委托在没有创建新的session情况下。

下面来看下如何创建normal, ephemeral和background sessions.

self.completionHandlerDictionary = [NSMutableDictionary dictionaryWithCapacity:0];

NSURLSessionConfiguration *backgroundConfigObject = [NSURLSessionConfiguration backgroundSessionConfiguration: @"myBackgroundSessionIdentifier"];

NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];

NSURLSessionConfiguration *ephemeralConfigObject = [NSURLSessionConfiguration ephemeralSessionConfiguration];

NSURLCache *myCache = [[NSURLCache alloc] initWithMemoryCapacity: 16384 diskCapacity: 268435456 diskPath: cachePath];

defaultConfigObject.URLCache = myCache;

defaultConfigObject.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;

self.defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];

self.backgroundSession = [NSURLSession sessionWithConfiguration: backgroundConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];

self.ephemeralSession = [NSURLSession sessionWithConfiguration: ephemeralConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];

除了background configuration,可以重新使用session configuraion对象来创建其它的session.

因为它是深拷贝的。

使用系统提供的委托来获取资源

创建configuration object 和session

一个completion handler来处理当数据完全的接收到之后。

使用系统提供的委托,你只需要一行代码来获取一个指定的URL。

NSURLSession *delegateFreeSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];

[[delegateFreeSession dataTaskWithURL: [NSURL URLWithString: @"http://www.example.com/"]

completionHandler:^(NSData *data, NSURLResponse *response,

NSError *error) {

NSLog(@"Got response %@ with error %@.\n", response, error);

NSLog(@"DATA:\n%@\nEND DATA\n",

[[NSString alloc] initWithData: data

encoding: NSUTF8StringEncoding]);

}] resume];

注意:

系统提供的委托提供了有限的自定义网络行为。如果你的应用需要鉴权或后台下载等功能,系统委托就不适用了,如何实现一个完整的委托,请看:“Life Cycle of a URL Session.”

使用自定义委托来获取数据

如果使用自定义委托来获取数据,必须实现以下两个方法:

如果应用想在URLSession:dataTask:didReceiveData:返回后使用数据,代码必须将数据进行保存处理。

data task example

NSURL *url = [NSURL URLWithString: @"http://www.example.com/"];

NSURLSessionDataTask *dataTask = [self.defaultSession dataTaskWithURL: url];

[dataTask resume];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值