在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 ()<nsurlsessiondatadelegate></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>