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];