1.背景上傳下載下傳;
2.不需要通過nsoperation,直接用nsurlsession的api就可以做到網絡操作的暫停和恢複。
3.作為可配置的容器:例如你可以設定http頭的一些屬性并且儲存在session裡,不用重複去做配置
4.可以子類化并支援私有配置的session
5.對鑒權的回調做了改進,此前nsurlconnection的鑒權回調無法和請求進行比對,該回調可能來自任意的請求;而現在每個請求都可以在指定的代理方法中對其進行處理.
nsurlsession層次結構示意圖:
可以看到,它包含了配置、代理還有用來處理各種任務的task,在task裡面實作了各種不同的http請求。task的結構圖如下:
我們可以看到其中子類化了上傳下載下傳的任務,并且支援挂起/恢複/取消的操作;傳回的nsdata需要自己去處理,這點比起afnetworking的便捷程度可以說有所不如,畢竟afnetworking是在更高的層次進行了封裝。
進行一次标準的網絡操作我們分為如下幾步:
step1:配置session,比如配置請求的header;配置是否儲存緩存、cookie、證書等
代碼示例如下:
NSURLSessionConfiguration
*config = [NSURLSessionConfiguration ephemeralSessionConfiguration];
// 2
[config setHTTPAdditionalHeaders:@{@"Authorization":[Dropbox
apiAuthorizationHeader]}];
// 3
_session =
[NSURLSession sessionWithConfiguration:config];
step2:
使用生成的session調用任務方法,儲存方法傳回的task;對該task執行resume操作(預設生成的task是處于挂起狀态)。
此處的任務方法有兩種類型,一種是taskwithurl,一種是taskwithrequest,簡單來說隻針對url請求就可以調用withurl方法,如果需要在請求中帶上更多内容進行一些配置的話需要采用taskwithrequest相關的方法。
= [Dropbox appRootURL];
// 2
NSURLSessionDataTask
*dataTask =
[self.session dataTaskWithURL:url
if
(!error){
// TODO 1: More coming here!
}
}];
// 3
[dataTask resume];
step3:
在上一步請求中的block實作結果解析(nsdata需要根據接口具體情況(一般是伺服器側決定的)解析成可以了解的資料,如json/xml/plist等);也可以不在block中進行相關操作,而是實作相關的代理方法(需要在step1中先設定session的代理),對相關的結果/進度等進行處理。
urlsession相關的代理方法有很多,這裡不一一列舉,主要有以下幾組協定:
@protocol NSURLSessionDelegate <NSObject> // session的代理,相當于所有協定的父類
@protocol NSURLSessionTaskDelegate <NSURLSessionDelegate> // task的代理,其父協定是NSURLSessionDelegate
@protocol NSURLSessionDataDelegate <NSURLSessionTaskDelegate>
// datatask的代理,其父協定是NSURLSessionTaskDelegate
@protocol NSURLSessionDownloadDelegate <NSURLSessionTaskDelegate> // downloadtask的代理,其父協定是NSURLSessionDataDelegate
結合其對應類的層次關系,相關的幾組協定的關系也就不難了解了。