这系列的教程整理自:
一.NSURLSession
概述
NSURLSession
是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection
是并列的。
NSURLSession
是IOS SDK提供的一组相对容易使用的网络API。它包括一下几个部分:
NSURLRequest
NSURLCache
NSURLSession
NSURLSessionConfiguration
NSURLSessionTask
二.介绍下NSURLSession
的几个核心类
1.NSURLSessionConfiguration
指定NSURLSession
的配置信息。这些配置信息决定了NSURLSession
的种类,HTTP的额外headers
,请求的timeout
时间,Cookie
的接受策略等配置信息。
这里详细讲解下三种NSURLSessionConfiguration
,这决定了NSURLSession
种类:
- 使用基于硬盘的持久化Cache,保存用户的证书到钥匙串,使用共享cookie存储
+ (NSURLSessionConfiguration*)defaultSessionConfiguration;
- 配置信息和default大致相同。除了,不会把cache,证书,或者任何和Session相关的数据存储到硬盘,而是存储在内存中,生命周期和Session一致。比如浏览器无痕浏览等功能就可以基于这个来做。
+ (NSURLSessionConfiguration*)ephemeralSessionConfiguration; //ephemeral单词是短暂的意思
- 创建一个可以在后台甚至APP已经关闭的时候仍然在传输数据的会话。注意,后台Session一定要在创建的时候赋予一个唯一的identifier,这样在APP下次运行的时候,能够根据identifier来进行相关的区分。
+ (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier NS_AVAILABLE(10_10, 8_0);
2.NSURLSessionTask
实际的Session任务,分为三种,继承关系如图:
NSURLSessionDataTask
:用来请求资源,然后服务器返回数据,在内存中存储为NSData格式,default
,ephemeral
,shared Session
支持data task
,background session
不支持。NSURLSessionUploadTask
:和DataTask
类似,只不过在请求的时候提供了request body
。并且background Session
支持upload task
NSURLSessionDownloadTask
:下载内容到硬盘上,所有类型的Session都支持
注意,创建的task都是挂起状态,需要resume才能执行。
3.NSURLSession
会话是基于NSURLSession
网络开发的核心组件,由上文的Configuration
来配置,然后作为工厂,创建NSURLSessionTask
来进行实际的数据传输任务。
一个初始化的例子:
self.session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionDataTask * dataTask = [self.session dataTaskWithURL:[NSURL URLWithString:imageURL] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
}];
[dataTask resume];
4.NSURLRequest
指定请求的URL和cache策略,例如,如下这个初始化函数
+ (instancetype)requestWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval;
上面的初始化方法可以在初始化的时候指定url
,cachePolicy
以及 timeoutInterval
。通过NSURLRequest
可以设置HTTPMethod
,默认是GET
。
5.NSURLCache
内存缓存我们可以使用NSURLCache
类,NSURLCache还提供了很多方法,来方便我们实现应用程序的缓存机制。
self.urlCache = [NSURLCache sharedURLCache];
[self.urlCache setMemoryCapacity:1*1024*1024];
//从请求中获取缓存输出
NSCachedURLResponse *response =[self.urlCache cachedResponseForRequest:self.request];
6.NSURLResponse/NSHTTPURLResponse
通过REST API
进行资源操作的时候,有request
(请求)必然就有response
(响应)。NSURLResponse
中包含了metadata
,例如返回的数据长度(expectedContentLength
),MIME
类型,text
编码方式。
NSHTTPURLResponse
是NSURLResponse
的子类,由于绝大部分的REST都是HTTP
的,所以,通常遇到的都是NSHTTPURLResponse
对象。通过这个对象可以获得:HTTP的headers
,status Code
等信息。
7.NSURLCredential
用来处理证书信息,比如用户名密码,比如服务器授权等等
8.NSURLAuthenticationChallenge
在访问资源的时候,可能服务器会返回需要授权(提供一个NSURLCredential
对象)。
9.NSURLProtectionSpace
这个类的对象代表了服务器上的一块需要授权信息的区域,英文叫realm。通过这个对象的信息来响应Challenge。
三.代理delegate
NSURLSession
的代理通常是两个层次的,Session
层次和Task
层次(一个Session可以包括多个Task)
- NSURLSessionDelegate:处理Session层次事件
- NSURLSessionTaskDelegate:处理所有类型Task层次共性事件
- NSURLSessionDownloadDelegate:处理Download类型的Task层次事件
- NSURLSessionDataDelegate:处理Download类型的Task层次事件