天天看點

iOS網絡程式設計之三——NSURLConnection的簡單使用

    在ios7後,nsurlsession基本代替了nsurlconnection進行網絡開發,在ios9後,nsurlconnection相關方法被完全的棄用,ios系統有向下相容的特性,盡管nsurlconnection已經被棄用,但在開發中,其方法依然可以被使用,并且如果需要相容到很低版本的ios系統,有時就必須使用nsurlconnection類了。

    對于網絡請求分為同步和異步兩種,同步是指在請求結果傳回之前,程式代碼會卡在請求處,之後的代碼不會被執行,異步是指在發送請求之後,一邊在子線程中接收傳回資料,一邊執行之後的代碼,當傳回資料接收完畢後,采用回調的方式通知主線程做處理。

    使用如下方法進行nsurlconnection的同步請求:

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

1

2

3

4

5

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

<code>    </code><code>nsurlrequest * request = [nsurlrequest requestwithurl:url];</code>

<code>    </code><code>nsdata * data = [nsurlconnection sendsynchronousrequest:request returningresponse:nil error:nil];</code>

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

<code>    </code><code>nslog(@</code><code>"繼續執行"</code><code>);</code>

列印資訊如下圖所示,從中可以看出,當資料傳回結束時才執行後面的代碼:

iOS網絡程式設計之三——NSURLConnection的簡單使用

        使用同步的方式進行請求有一個很大的弊端,在進行網絡請求時,資料的傳回往往需要一定時間,不可能瞬間完成,使用同步的方式将導緻界面卡死,沒有提示也不能互動任何使用者操作,這樣的話,很有可能會給使用者程式卡死的假象。

        nsurlconnection類提供兩種方式進行異步請求操作。

        使用如下代碼進行block方式的異步請求,在block中會傳入請求到的傳回資料和資料資訊等參數:

6

7

<code>    </code><code>//其中的queue參數決定block中的代碼在哪個隊列中執行</code>

<code>    </code><code>[nsurlconnection sendasynchronousrequest:request queue:[nsoperationqueue mainqueue] completionhandler:^(nsurlresponse * _nullable response, nsdata * _nullable data, nserror * _nullable connectionerror) {</code>

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

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

        首先遵守協定與生命一個可變的nsdata用于接收資料:

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

<code>{</code>

<code>    </code><code>nsmutabledata * _data;</code>

<code>}</code>

<code>@end</code>

使用如下的代碼進行請求:

<code>    </code><code>_data = [[nsmutabledata alloc]init];</code>

<code>    </code><code>[nsurlconnection connectionwithrequest:request delegate:self];</code>

請求發出後,會一次調用如下代理方法進行請求過程的監聽和資料的擷取:

8

9

10

11

12

13

14

15

16

<code>-(</code><code>void</code><code>)connection:(nsurlconnection *)connection didreceiveresponse:(nsurlresponse *)response{</code>

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

<code>    </code><code>[_data setlength:0];</code>

<code>-(</code><code>void</code><code>)connection:(nsurlconnection *)connection didreceivedata:(nsdata *)data{</code>

<code>    </code><code>//正在接收資料</code>

<code>    </code><code>[_data appenddata:data];</code>

<code>-(</code><code>void</code><code>)connection:(nsurlconnection *)connection didfailwitherror:(nserror *)error{</code>

<code>    </code><code>//接收資料失敗</code>

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

<code>-(</code><code>void</code><code>)connectiondidfinishloading:(nsurlconnection *)connection{</code>

<code>    </code><code>//接收資料完成</code>

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

繼續閱讀