天天看點

IOS7引入API之NSURLSession入門介紹

1.背景上傳下載下傳;

2.不需要通過nsoperation,直接用nsurlsession的api就可以做到網絡操作的暫停和恢複。

3.作為可配置的容器:例如你可以設定http頭的一些屬性并且儲存在session裡,不用重複去做配置

4.可以子類化并支援私有配置的session

5.對鑒權的回調做了改進,此前nsurlconnection的鑒權回調無法和請求進行比對,該回調可能來自任意的請求;而現在每個請求都可以在指定的代理方法中對其進行處理.

nsurlsession層次結構示意圖:

IOS7引入API之NSURLSession入門介紹

可以看到,它包含了配置、代理還有用來處理各種任務的task,在task裡面實作了各種不同的http請求。task的結構圖如下:

IOS7引入API之NSURLSession入門介紹

我們可以看到其中子類化了上傳下載下傳的任務,并且支援挂起/恢複/取消的操作;傳回的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

結合其對應類的層次關系,相關的幾組協定的關系也就不難了解了。