• 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 ");
     7 }
     8 
     9 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    10 {
    11     printf("didReceiveData ");
    12 }
    13 
    14 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    15 {
    16     printf("didFailWithError ");
    17 }
    18 
    19 - (void)connectionDidFinishLoading:(NSURLConnection *)connection
    20 {
    21     printf("connectionDidFinishLoading ");
    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。

  • 相关阅读:
    项目alpha冲刺-测试
    项目Alpha冲刺--9/10
    项目Alpha冲刺--8/10
    项目Alpha冲刺--7/10
    项目Beta冲刺(1/7)(追光的人)(2019.5.23)
    Beta之前-凡事预则立(校园帮-追光的人)
    事后诸葛亮(追光的人)
    问题回答
    Alpha冲刺总结
    Alpha冲刺(10/10)——追光的人
  • 原文地址:https://www.cnblogs.com/huliangwen/p/5495468.html
Copyright © 2020-2023  润新知