1 简介

1.1 概念

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

1.2 第一个程序

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

  1.  1 -(void)first_application
  2.  2 {
  3.  3     // Create the request.
  4.  4     NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"]
  5.  5                                               cachePolicy:NSURLRequestUseProtocolCachePolicy
  6.  6                                               timeoutInterval:60.0];
  7.  7             
  8.  8     [NSURLConnection sendAsynchronousRequest:theRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
  9.  9         printf("finish:%d");
  10. 10     }]; 
  11. 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.  1 @interface URLConnection_customDelegate : NSObject <NSURLConnectionDataDelegate>
  2.  2 @end
  3.  3 @implementation URLConnection_customDelegate 
  4.  4 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
  5.  5 {
  6.  6     printf("didReceiveResponse\n");
  7.  7 }
  8.  8 
  9.  9 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
  10. 10 {
  11. 11     printf("didReceiveData\n");
  12. 12 }
  13. 13 
  14. 14 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
  15. 15 {
  16. 16     printf("didFailWithError\n");
  17. 17 }
  18. 18 
  19. 19 - (void)connectionDidFinishLoading:(NSURLConnection *)connection
  20. 20 {
  21. 21     printf("connectionDidFinishLoading\n");
  22. 22 }
  23. 23 @end

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

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

注意:

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

4 与NSURLSession的差异

NSURLConnection 中存在如下的问题:

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

5 参考文献

[1] URL Session programming guide。

iOS 网络编程:NSURLConnection的更多相关文章

  1. IOS网络编程:HTTP

    IOS网络编程:HTTP HTTP定义了一种在服务器和客户端之间传递数据的途径. URL定义了一种唯一标示资源在网络中位置的途径. REQUESTS 和 RESPONSES: 客户端先建立一个TCP连 ...

  2. iOS网络编程模型

    iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...

  3. IOS网络编程——第三方类库

    IOS网络编程——第三方类库 目录 概述 ASIHttpRequest AFNetworking 其他 概述 ASIHttpRequest AFNetworking 其他

  4. iOS网络编程笔记——Socket编程

    一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是T ...

  5. 浅谈iOS网络编程之一入门

    计算机网络,基本上可以抽象是端的通信.实际在通讯中会用到不同的设备,不同的硬件中,为了能友好的传输信息,那么建立一套规范就十分必要了.先来了解一些基本概念 了解网络中传输的都是二进制数据流.  2.了 ...

  6. iOS 网络编程模式总结

    IOS 可以采用三类api 接口进行网络编程,根据抽象层次从低到高分别为socket方式.stream方式.url 方式. 一 .socket 方式 IOS 提供的socket 方式的网络编程接口为C ...

  7. ios网络编程(入门级别)-- 基础知识

    在学习ios的过程中,停留在UI控件很长时间,现在正在逐步的接触当中!!!!!!在这个过程中,小编学到了一些关于网络编程知识,并且有感而发,在此分享一下: 关于网络请求的重要性我想不用多说了吧!!!对 ...

  8. iOS 网络编程(HTTP协议)

    HTTP协议的概念HTTP协议,Hyper Text Transfer Protocol (超文本传输协议)是用于从万维网服务器传送超文本到本地浏览器的传输协议,HTTP是一个应用层协议,由请求和响应 ...

  9. iOS网络编程

    今天的重点是UIWebView.NSURLSession.JSon. 网络编程联网准备:1.在Info.plist中添加AppTransportSecurity类型Dictionary:2.在AppT ...

  10. ios网络编程学习

    //网络访问获取数据//定义一个UIWebView属性,用来展示数据 @property (strong, nonatomic) IBOutlet UIWebView *myWebView; //.. ...

随机推荐

  1. 【HDOJ】1356 The Balance

    扩展欧几里得的应用. /* 1356 */ #include <iostream> #include <sstream> #include <string> #in ...

  2. 【HDOJ】1016 Prime Ring Problem

    经典DP,写的可能麻烦了一些. #include <stdio.h> #define false 0 #define true 1 ]; ]; ]; void DFS(int, int, ...

  3. Unity NGUI 图集Atlas制作

    unity版本:4.5 NGUI版本:3.6.5 1.选择要制作的图片放到对应目录下,在Asset下新建一个文件夹Picture用于放置图片: 2.选中一张图片,打开Atlas Maker: 3.单击 ...

  4. bzoj1497

    这道题让我涨姿势了 对于这类问题,我们称作最大权闭合图问题 就是每个点都有一个点权,要求选择一个点集,其中每个点的指向的点也在点集中,使这样一个点权和最大 对于这种问题,我们添加源点s,汇点t 对于点 ...

  5. 转自 Good morning 的几句精辟的话

    1.志愿者招募 根据流量平衡方程来构图非常方便,而且简单易懂,以后可能成为做网络流的神法之一 简单记一下流量平衡方程构图法的步骤: a.列出需求不等式 b.通过设置松弛变量,将不等式变成等式 c.两两 ...

  6. 盘点国内程序员不常用的热门iOS第三方库

    https://github.com/syedhali/EZAudio 基于核心音频,有助于进行实时,低延迟音频处理和可视化的iOS和OSX音频可视化框架. https://github.com/ba ...

  7. Nginx、SSL双向认证、PHP、SOAP、Webservice、https

    本文是1:1模式,N:1模式请参见新的一篇博客<SSL双向认证(高清版)> ----------------------------------------------------- 我是 ...

  8. Enum 枚举

    一: 1. foreach (int val in Enum.GetValues(typeof(AppEnum.HarbourStatus))) { ddlStatus.Items.Add(new L ...

  9. 我的第一个项目:用kinect录视频库

    kinect深度视频去噪 kinectmod32.dll http://pan.baidu.com/s/1DsGqX 下载后改名kinect.dll 替换掉Redist\OpenNI2\Drivers ...

  10. [codevs2170]悠闲的漫步

    题目来源 http://codevs.cn/problem/2170/ http://www.tyvj.cn/p/1033 背景 USACO OCT09 5TH 描述 Bessie透过牛棚的大门向外望 ...