天天看點

iOS網絡程式設計之二——NSURLSession的簡單使用

    在ios7之後,nsurlsession作為系統推薦使用的http請求架構,在進行前台請求的情況下,nsurlsession與nsurlconnection并無太大差異,對于背景的請求,nsurlsession更加靈活的優勢就将展現無遺。

        nsurlsession類提供3中session類型:

        default類型:提供前台請求相關方法,支援配置緩存,身份憑證等。

        ephemeral類型:即時的請求類型,不使用緩存,身份憑證等。

        background:背景類型,支援在背景完成請求任務。

        在nsurlsession中添加的請求任務支援3中類型:

        資料任務:使用nsdata對象進行資料的發送和擷取,一般用于短資料的任務。

        下載下傳任務:從檔案下載下傳資料,支援背景下載下傳。

        上傳任務:以檔案的形式上傳資料,支援背景上傳。

        通過nsurlsessionconfiguration類對象對nsurlsession進行配置與建立,建立和配nsurlsession的示例代碼如下:

<a href="http://my.oschina.net/u/2340880/blog/618888#">?</a>

1

2

3

4

5

6

7

8

9

10

11

<code>    </code><code>//預設類型的</code>

<code>    </code><code>nsurlsessionconfiguration * defaultconfiguration = [nsurlsessionconfiguration defaultsessionconfiguration];</code>

<code>    </code><code>//即時類型的</code>

<code>    </code><code>nsurlsessionconfiguration * ephemeralconfiguration = [nsurlsessionconfiguration ephemeralsessionconfiguration];</code>

<code>    </code><code>//背景類型的</code>

<code>    </code><code>nsurlsessionconfiguration * backgroundconfiguration = [nsurlsessionconfiguration backgroundsessionconfigurationwithidentifier:@</code><code>"sessionid"</code><code>];</code>

<code>    </code> 

<code>    </code><code>//建立并設定session</code>

<code>    </code><code>nsurlsession * defaultsession = [nsurlsession sessionwithconfiguration:defaultconfiguration];</code>

<code>    </code><code>nsurlsession * ephemeralsession = [nsurlsession sessionwithconfiguration:ephemeralconfiguration];</code>

<code>    </code><code>nsurlsession * backgroundsession = [nsurlsession sessionwithconfiguration:backgroundconfiguration];</code>

nsurlsessionconfiguration還可以配置如緩存,網絡模式等參數

        nsurlsession有兩種方式進行網絡資料的請求,一種是通過block的方式擷取網絡資料,一種是通過代理回調的方式擷取網絡資料。通過block的方式進行請求代碼如下:

12

<code>    </code><code>//建立session配置對象</code>

<code>    </code><code>//建立請求對象</code>

<code>    </code><code>nsurlrequest * request = [nsurlrequest requestwithurl:[nsurl urlwithstring:@</code><code>"http://www.baidu.com"</code><code>]];</code>

<code>    </code><code>//建立session對象</code>

<code>    </code><code>//添加任務</code>

<code>    </code><code>nsurlsessiontask * task= [defaultsession datataskwithrequest:request completionhandler:^(nsdata * _nullable data, nsurlresponse * _nullable response, nserror * _nullable error) {</code>

<code>        </code><code>nslog(@</code><code>"%@"</code><code>,data);</code>

<code>    </code><code>}];</code>

<code>    </code><code>//開始任務</code>

<code>    </code><code>[task resume];</code>

使用代理回調的方式進行請求需要遵守如下協定:

<code>@interface viewcontroller ()&lt;nsurlsessiondatadelegate&gt;</code>

<code>@end</code>

将請求代碼修改如下:

<code>    </code><code>nsurlsession * defaultsession = [nsurlsession sessionwithconfiguration:defaultconfiguration delegate:self delegatequeue:[nsoperationqueue mainqueue]];</code>

<code>    </code><code>nsurlsessiontask * task= [defaultsession datataskwithrequest:request];</code>

實作代理方法如下:

<code>//開始接受資料</code>

<code>-(</code><code>void</code><code>)urlsession:(nsurlsession *)session datatask:(nsurlsessiondatatask *)datatask didreceivedata:(nsdata *)data{</code>

<code>    </code><code>nslog(@</code><code>"=======%@"</code><code>,data);</code>

<code>}</code>

<code>//接受資料結束</code>

<code>-(</code><code>void</code><code>)urlsession:(nsurlsession *)session task:(nsurlsessiontask *)task didcompletewitherror:(nserror *)error{</code>

<code>    </code><code>nslog(@</code><code>"完成:error%@"</code><code>,error);</code>

        nsurlsession最大的優勢在于其背景下載下傳的靈活性,使用如下的代碼進行背景資料下載下傳:

<code> </code><code>nsurlsessionconfiguration * backgroundconfiguration = [nsurlsessionconfiguration backgroundsessionconfigurationwithidentifier:@</code><code>"com.zyprosoft.backgroundsession"</code><code>];</code>

<code>    </code><code>nsurlsession *  backgroundsession   = [nsurlsession sessionwithconfiguration:backgroundconfiguration delegate:self delegatequeue:nil];</code>

<code>    </code><code>[[backgroundsession downloadtaskwithrequest:request]resume];</code>

在下面的回調方法中可以進行下載下傳進度的監聽:

<code>- (</code><code>void</code><code>)urlsession:(nsurlsession *)session downloadtask:(nsurlsessiondownloadtask *)downloadtask didwritedata:(int64_t)byteswritten totalbyteswritten:(int64_t)totalbyteswritten totalbytesexpectedtowrite:(int64_t)totalbytesexpectedtowrite</code>

<code>{</code>

<code>    </code><code>nslog(@</code><code>"######"</code><code>);</code>

如果在下載下傳過程中點選home鍵使應用程式進入背景,nsurlsession的相關代理方法将不再被回調,但是下載下傳任務依然在進行,當背景下載下傳完成後會與appdelegate進行互動,會調用appdelegate中的如下方法:

<code>-(</code><code>void</code><code>)application:(uiapplication *)application handleeventsforbackgroundurlsession:(nsstring *)identifier completionhandler:(</code><code>void</code> <code>(^)())completionhandler{</code>

<code>    </code><code>nslog(@</code><code>"1111"</code><code>);</code>

之後應用程式在背景會調用nsurlsesstion代理的如下方法來通知下載下傳結果:

<code>//此方法無論成功失敗都會調用</code>

<code>//此方法隻有下載下傳成功才會調用 檔案放在location位置</code>

<code>-(</code><code>void</code><code>)urlsession:(nsurlsession *)session downloadtask:(nsurlsessiondownloadtask *)downloadtask didfinishdownloadingtourl:(nsurl *)location{</code>

最後将調用nsurlsesstion的如下方法:

<code>-(</code><code>void</code><code>)urlsessiondidfinisheventsforbackgroundurlsession:(nsurlsession *)session</code>

<code>    </code><code>nslog(@</code><code>"all tasks are finished"</code><code>);</code>