iOS 网络编程:NSURLConnection

1 简介

1.1 概念

      NSURLConnection类似NSURLSession,都是进行网络数据传输的。其中NSURLSession是NSURLConnection的替代版本,目前IOS9.0几乎将NSURLConnection类废弃了。

1.2 第一个程序

      如下是简单通过异步的方式请求HTTP数据:

 1 -( void)first_application
 2 {
 3      //  Create the request.
 4      NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString: @" http://www.apple.com/ "]
 5                                               cachePolicy:NSURLRequestUseProtocolCachePolicy
 6                                               timeoutInterval: 60.0];
 7             
 8     [NSURLConnection sendAsynchronousRequest:theRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
 9         printf( " finish:%d ");
10     }]; 
11 }

 

2 创建 connection

      NSURLConnection类提供三种获取URL内容的方式:synchronously(同步)、asynchronously代码快、asynchronously自定义delegate。

       1) synchronously方式

       这种方式是通过调用sendSynchronousRequest:returningResponse:error: 方法来完成操作的。若调用该方法请求HTTP数据时,只有当完成请求或是出错时,才能返回。

       2) asynchronously方式

          若不需要监控请求的状态,且仅仅需要当完成数据传输时执行一些操作,那么可以调用sendAsynchronousRequest:queue:completionHandler:方法。

       3) delegate 方式

          这种方式将操作交给了delegate协议进行操作,其中NSURLConnection支持的协议有: NSURLConnectionDelegate, NSURLConnectionDownloadDelegateNSURLConnectionDataDelegate 协议。

      通过上述三个方法能够创建NSURLConnection对象,但是在IOS9.0已经将这三个方法Deprecated了,即不推荐使用。

3 自定义delegate

      NSURLConnection类的三种使用方式中的前两种使用方式都非常简单,并且Apple也不推荐使用同步的方式,而且block的方式会有很多的限制,所以这里只介绍delegate的使用方式。

      若需要实现NSURLConnection协议,那么至少需要实现如下方法:

  • connection:didReceiveResponse:当连接线程接收了足够数据构建一个 URL response对象时,就调用该方法。
  • connection:didReceiveData:当接收到从服务器一个数据块时,将调用该方法。
  • connection:didFailWithError:当连接传输时,发生错误时,调用该方法。
  • connection:DidFinishLoading:当请求的连接已经完成下载任务,那么将调用该方法。

如下是实现NSURLConnectionDataDelegate协议的类:

 1 @interface URLConnection_customDelegate : NSObject <NSURLConnectionDataDelegate>
 2 @end
 3 @implementation URLConnection_customDelegate 
 4 - ( void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
 5 {
 6     printf( " didReceiveResponse\n ");
 7 }
 8 
 9 - ( void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
10 {
11     printf( " didReceiveData\n ");
12 }
13 
14 -( void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
15 {
16     printf( " didFailWithError\n ");
17 }
18 
19 - ( void)connectionDidFinishLoading:(NSURLConnection *)connection
20 {
21     printf( " connectionDidFinishLoading\n ");
22 }
23 @end

 

如下是使用自定义delegate的方式:

1 -( void)customDelegate_application
2 {
3     URLConnection_customDelegate* customDelegate = [[URLConnection_customDelegate alloc] init];
4     NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString: @" http://www.apple.com/ "]
5                                               cachePolicy:NSURLRequestUseProtocolCachePolicy
6                                           timeoutInterval: 60.0];
7     NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest  delegate:customDelegate];
8 }

注意:

       在调用initWithRequest:delegate: message后将立即接收数据,同时在完成数据传输之前,即在connectionDidFinishLoading: 和connection:didFailWithError方法被调用之前,都可以手动调用cancel方法取消下载任务。

 

4 与NSURLSession的差异

      NSURLConnection 中存在如下的问题:

  • iOS 2.0推出的古老而有经典的网络解决方案;
  • 复杂的网络操作需要通过代理来实现;
  • 代理方式默认在主线程工作;
  • 只提供了start & cancel方法,不能暂停;
  • 在使用多线程时需要使用运行循环。

 

5 参考文献

      [1] URL Session programming guide。

转载于:https://www.cnblogs.com/huliangwen/p/5495468.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值