ios之NSURLRequest&NSURLConnection
网络编程中一般都是经过 请求---》连接---》响应 (request --》 connection --》 response)这个过程。
一般的步骤是这样的:
1、先创建一个NSURL。
2、通过这个指定的URL创建NSURLRequest,这里还可以指定缓存策略和超时时间。
3、根据你的request创建NSURLConnection,并对你的connection进行响应(同步、异步)。
下面详细解说这个过程
1、创建URL
- NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];
2、创建NSURLRequest
- NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
解释一下其中的初始化参数:initWithURL:这里指定要访问的url;cachePolicy:这里是指定缓存策略(包括6种);timeoutInterval:指定超时时间
缓存策略:
- NSURLRequestCachePolicy
- These constants are used to specify interaction with the cached responses.
- enum
- {
- NSURLRequestUseProtocolCachePolicy = 0,
- NSURLRequestReloadIgnoringLocalCacheData = 1,
- NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4,
- NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,
- NSURLRequestReturnCacheDataElseLoad = 2,
- NSURLRequestReturnCacheDataDontLoad = 3,
- NSURLRequestReloadRevalidatingCacheData = 5
- };
- typedef NSUInteger NSURLRequestCachePolicy;
稍微解释一下:
NSURLRequestUseProtocolCachePolicy(基础策略)这个是NSURLRequest的默认策略
NSURLRequestReloadIgnoringLocalCacheData(忽略本地缓存)
NSURLRequestReturnCacheDataElseLoad(首先使用缓存,如果没有本地缓存,才从原地址下载)
NSURLRequestReturnCacheDataDontLoad(使用本地缓存,从不下载,如果本地没有缓存,则请求失败,此策略多用于离线操作)
NSURLRequestReloadIgnoringLocalAndRemoteCacheData(无视任何缓存策略,无论是本地的还是远程的,总是从原地址重新下载)
NSURLRequestReloadRevalidatingCacheData(如果本地缓存是有效的则不下载,其他任何情况都从原地址重新下载)
具体的请参看这一篇博客:http://blog.csdn.net/zeng11088/article/details/8544759(
NSURLRequest的官方文档的译文
)
3、创建NSURLConnection & 响应
首先,上面讲到网络编程有同步和异步两种连接方式,连接采用同步响应是通过使用sendSynchronousRequest方法实现的,而连接采用异步响应是通过代理NSURLConnectionDelegate的方法实现的。
(1)同步连接响应:使用这个方法。
- + (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
例如:
- NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
(2)异步连接响应:代理实现
创建一个connection之后调用以下相关的代理方法
- NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:self];
①Sent when the connection has received sufficient data to construct the URL response for its request.
- - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
②Sent as a connection loads data incrementally.
- - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
③Sent when a connection has finished loading successfully
- - (void)connectionDidFinishLoading:(NSURLConnection *)connection
④Sent when a connection fails to load its request successfully.
- - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
稍微解释一下这个过程:如果connection收到response,就调用delegate中的第①个方法didReceiveResponse方法,这里需要创建一个data缓冲区,这个是第一步。然后一点点接收数据,不断追加到先前创建的data,这个过程会重复调用didReceiveData方法,这个是第二步。如果接受完成,会调用connectionDidFinishLoading这个方法,表示数据全部接收完毕;如果接收数据出现错误或者异常,则会调用didFailWithError这个方法结束,这是第三步。
附:如果网络请求进行了一半时退出程序,大家都知道这时候程序会被挂起,那么网络连接怎么办呢?实际上当程序退出时,系统并不会立即挂起应用进程,而是会延迟大概一秒,如果这样请求还是没有完成,系统底层会默默地帮你把数据都接收完,帮你保存请求超时时间那么久。比如你设置超时时间30s,30s内重新打开应用,数据就立刻全都一次性收到,如果没打开,不好意思,下次打开程序时,delegate的didFailWithError方法会被调用,通知你请求超时了。
ios之NSURLRequest&NSURLConnection的更多相关文章
- iOS网络1——NSURLConnection使用详解
原文在此 一.整体介绍 NSURLConnection是苹果提供的原生网络访问类,但是苹果很快会将其废弃,且由NSURLSession(iOS7以后)来替代.目前使用最广泛的第三方网络框架AFNetw ...
- 【iOS基础】NSURLConnection
一.大文件下载1.方案:利用NSURLConnection和它的代理方法1> 发送一个请求 // 1.URL NSURL *url = [NSURL URLWithString:@"h ...
- iOS NSURLSession VS NSURLConnection
NSURLSession VS NSURLConnection NSURLSession可以看做是NSURLConnection的进化版,其对NSURLConnection的改进点有: * 根据每个S ...
- iOS开发系列-NSURLConnection
概述 NSURLConnection是负责发送请求,建立客户端与服务端的连接.发送数据给服务器,并收集来自服务器的响应数据.其中NSURLRequest类是用来封装一个请求,包含NSURL对象.请求方 ...
- iOS 开发笔记-NSURLConnection的使用
通过NSURLConnection发送一个HTTP GET请求 //send a GET request to server with some params -(void)httpGetWithPa ...
- 客户端(android,ios)与服务器通信
android,ios客户端与服务器通信为了便于理解,直接用PHP作为服务器端语言 其实就是一个 http请求响应的过程序,先从 B/S模式说起浏览器发起http请求,服务器响应请求,并把数据返回给浏 ...
- iOS - NSURLConnection 网络请求
前言 @interface NSURLConnection : NSObject class NSURLConnection : NSObject DEPRECATED: The NSURLConne ...
- IOS NSURLConnection(大文件下载)
NSURL:请求地址 NSURLRequest:一个NSURLRequest对象就代表一个请求,它包含的信息有 一个NSURL对象 请求方法.请求头.请求体 请求超时 … … NSMutableURL ...
- 【原】HTTP in iOS你看我就够
声明:本文是本人 编程小翁 原创,转载请注明. 本文同步发布在简书中,强烈建议移步简书查看,编程小翁 HTTP属于老话题了,在项目中我们经常需要往服务端发POST或者GET请求,但是对于HTTP的了解 ...
随机推荐
- MongoDb Samus 驱动的改进
一直使用 MongoDb 的 Samus C#驱动. 其有一个缺陷,就是无法支持struct的读写. 但是一般数据都用Class包装,所以也没有太在意. 随着这些天尝试写入 KLineData 时,遇 ...
- [Xcode 实际操作]九、实用进阶-(23)多个Storyboard故事板中的页面跳转
目录:[Swift]Xcode实际操作 本文将演示多个Storyboard故事板中的页面跳转. 使用快捷键[Command]+[N]创建一个新的故事板文件. (在项目文件夹[DemoApp]上点击鼠标 ...
- Android的文件读取与存储
Java新建文件,然后就可以写入数据了,但是Android却不一样,因为Android是 基于Linux的,我们在读写文件的时候,还需加上文件的操作模式 Environment类是一个提供访问环境变量 ...
- Tomcat - ClassFormatException的解决方法
问题与分析 在使用Tomcat7运行web项目时报错如下: 严重: Compilation error org.eclipse.jdt.internal.compiler.classfmt.Class ...
- Gitlab备份,Crontab定时备份
1:Gitlab备份非常简单,只需要一条命令就可以创建完整的备份 gitlab-rake gitlab:backup:create 使用以上命令,就相当于在/var/opt/gitlab/backup ...
- typedef与复杂声明
参考 [1] http://www.cnblogs.com/bakari/archive/2012/08/28/2659889.html [2]<C专家编程> [3 ]http://www ...
- 112 Path Sum 路径总和
给定一棵二叉树和一个总和,确定该树中是否存在根到叶的路径,这条路径的所有值相加等于给定的总和.例如:给定下面的二叉树和 总和 = 22, 5 / \ ...
- UESTC - 1544 当咸鱼也要按照基本法 组合数学 容斥原理
http://acm.uestc.edu.cn/#/problem/show/1544 考虑一下2.2.2这样的情况.答案应该是n / 2 如果只选一个的情况下,对答案的贡献是正的,但是这里有三个,也 ...
- js实现文本框验证和实现小数的加减乘除
<script type="text/javascript"> //加法 var m=accAdd(1.22,1.22); //减法 var m1=accSub(1.2 ...
- hdu6118 度度熊的交易计划
思路: 将生产和运输费用视作产出,将销售获利视作投入,计算最小费用可行流(不一定是最大流).注意片区之间的高速公路是双向边. 实现: #include <iostream> #includ ...