ios NSURLSession簡介

iOS7 中咱們可使用NSURLSession類來進行URL請求。若是是更早以前的版本使用NSURLConnection,在此以前先看下ios中關於URL的一些相關類。html

URLLoading部分是咱們主要使用的類,其它五個是幫助類。涉及各個方面。協議支持,加密,cookie管理,緩存,配置。ios

NSURLSession中的任務的行爲依賴於三件事:session的類型(由傳入的configuration對象來決定),task的類型,當task建立時應用是否處於前臺。緩存

Session的類型

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沒有運行時,支持後臺上傳。


建立並配置一個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的 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];
相關文章
相關標籤/搜索