iOS7 中咱们可使用NSURLSession类来进行URL请求。若是是更早以前的版本使用NSURLConnection,在此以前先看下ios中关于URL的一些相关类。html
URLLoading部分是咱们主要使用的类,其它五个是帮助类。涉及各个方面。协议支持,加密,cookie管理,缓存,配置。ios
NSURLSession中的任务的行为依赖于三件事:session的类型(由传入的configuration对象来决定),task的类型,当task建立时应用是否处于前台。缓存
1. 默认session使用diskcache并将证书保存在用户keychain中。
cookie
2. 短暂session没有将任何数据存在disk上,全部相关的东西都在ram中,当session无效时,这些内容自动被清除。网络
3.后台session,和默认session相似,除了独立一个进程来处理全部的数据传送。还有些限制。session
Task的类型
app
在一个session中,NSURLSession支持三种任务类型:data tasks, download tasks, upload tasks
加密
data task: 使用NSData来发送和接收数据,适用于频繁的,数据量很小的交互。能够在数据到达时将数据发送给应用,或是在数据接收完成时,回调。
url
download task:以文件的形式接收数据。而且当app没有运行时,支持后台下载。
spa
upload task:发送数据(一般以文件的形式)。而且当app没有运行时,支持后台上传。
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的 sendAsynchronousRequest:queue:completionHandler:
方法。
注意:若是你的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.
由于它是深拷贝的。
最直接的方式是调用NSURLSession的sendAsynchronousRequest:queue:completionHandler:
方法。使用这个方法你只须要提供两段代码。
建立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: 一次接收一片的数据。
URLSession:task:didCompleteWithError:指明数据已经彻底接收到了。
若是应用想在URLSession:dataTask:didReceiveData:返回后使用数据,代码必须将数据进行保存处理。
data task example
NSURL *url = [NSURL URLWithString: @"http://www.example.com/"];
NSURLSessionDataTask *dataTask = [self.defaultSession dataTaskWithURL: url];
[dataTask resume];