天天看点

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>