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, NSURLConnectionDownloadDelegate和NSURLConnectionDataDelegate 协议。
通过上述三个方法能够创建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。
iOS 网络编程:NSURLConnection的更多相关文章
- IOS网络编程:HTTP
IOS网络编程:HTTP HTTP定义了一种在服务器和客户端之间传递数据的途径. URL定义了一种唯一标示资源在网络中位置的途径. REQUESTS 和 RESPONSES: 客户端先建立一个TCP连 ...
- iOS网络编程模型
iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...
- IOS网络编程——第三方类库
IOS网络编程——第三方类库 目录 概述 ASIHttpRequest AFNetworking 其他 概述 ASIHttpRequest AFNetworking 其他
- iOS网络编程笔记——Socket编程
一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是T ...
- 浅谈iOS网络编程之一入门
计算机网络,基本上可以抽象是端的通信.实际在通讯中会用到不同的设备,不同的硬件中,为了能友好的传输信息,那么建立一套规范就十分必要了.先来了解一些基本概念 了解网络中传输的都是二进制数据流. 2.了 ...
- iOS 网络编程模式总结
IOS 可以采用三类api 接口进行网络编程,根据抽象层次从低到高分别为socket方式.stream方式.url 方式. 一 .socket 方式 IOS 提供的socket 方式的网络编程接口为C ...
- ios网络编程(入门级别)-- 基础知识
在学习ios的过程中,停留在UI控件很长时间,现在正在逐步的接触当中!!!!!!在这个过程中,小编学到了一些关于网络编程知识,并且有感而发,在此分享一下: 关于网络请求的重要性我想不用多说了吧!!!对 ...
- iOS 网络编程(HTTP协议)
HTTP协议的概念HTTP协议,Hyper Text Transfer Protocol (超文本传输协议)是用于从万维网服务器传送超文本到本地浏览器的传输协议,HTTP是一个应用层协议,由请求和响应 ...
- iOS网络编程
今天的重点是UIWebView.NSURLSession.JSon. 网络编程联网准备:1.在Info.plist中添加AppTransportSecurity类型Dictionary:2.在AppT ...
- ios网络编程学习
//网络访问获取数据//定义一个UIWebView属性,用来展示数据 @property (strong, nonatomic) IBOutlet UIWebView *myWebView; //.. ...
随机推荐
- shutdown,init,halt,poweroff,reboot的区别和联系, pkill -kill -t tty7注销
前言 最近这些天,每天晚上关机前,都会在osc上发一条动弹,“我要init 0了,各位晚安啊”,这是一件再正常不过的事情了. 看似很平常的一件事情,不过在昨晚就被一位同学的回复给难住了,到底是什么样的 ...
- 六月计划#2A(6.10-6.16)
17/35 STL BZOJ_1588_&_Codevs_1296_[HNOI2002]_营业额统计(平衡树/set)(set重做) BZOJ_1208_&_Codevs_1258_[ ...
- WordPress Contact Form 7插件任意文件上传漏洞
漏洞名称: WordPress Contact Form 7插件任意文件上传漏洞 CNNVD编号: CNNVD-201311-415 发布时间: 2013-11-28 更新时间: 2013-11-28 ...
- NOI2014 随机数生成器
随机数生成器 [问题描述] 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来获得随机性.事实上,随机数生成函数也并不是真正的 ...
- SharePoint 2010 PowerShell 系列 之 备份、还原、部署 .WSP
转:http://www.cnblogs.com/Fengger/archive/2012/08/24/2654093.html PowerShell系列目录 最近在部署测试环境,就顺便把PowerS ...
- 使用Action、Func和Lambda表达式
使用Action.Func和Lambda表达式 在.NET在,我们经常使用委托,委托的作用不必多说,在.NET 2.0之前,我们在使用委托之前,得自定义一个委托类型,再使用这个自定义的委托类型定义一个 ...
- 从零开始学习jQuery (一) 开天辟地入门篇
一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案, 即使你会使用jQuery也能在阅读中发现些许秘籍. 本篇文章是入门第一篇, 主要是简单介绍jQuer ...
- golang安装卸载 linux+windows+raspberryPI 平台
参考 https://golang.org/doc/install 自ECUG2013洗脑回来,就渴望早点接触Go 听着许式伟和谢孟军的演讲 发现go的网络库的确很强大,高负载利器,语言的一些精简导 ...
- EventHandlerList z
写一个类时,有时候会在同一个类上添加很多事件,事件很多的话,是不容易管理的,.NET提供的EventHandlerList可以辅助多个事件的管 理,但不方便的地方是,它不是类型安全的,缺少类型安全,多 ...
- [Raobin] Ext.net在多重子父窗体中找到当前窗体的父窗体,并关闭IFrame父窗体
var closeParentWindow = function () { var currentWin = window; while (top != currentWin) { var prent ...