网络编程中一般都是经过  请求---》连接---》响应   (request  --》  connection  --》  response)这个过程。

一般的步骤是这样的:

1、先创建一个NSURL。

2、通过这个指定的URL创建NSURLRequest,这里还可以指定缓存策略和超时时间。

3、根据你的request创建NSURLConnection,并对你的connection进行响应(同步、异步)。

下面详细解说这个过程

1、创建URL

  1. NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];

2、创建NSURLRequest

  1. NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];

解释一下其中的初始化参数:initWithURL:这里指定要访问的url;cachePolicy:这里是指定缓存策略(包括6种);timeoutInterval:指定超时时间

缓存策略:

  1. NSURLRequestCachePolicy
  2. These constants are used to specify interaction with the cached responses.
  3. enum
  4. {
  5. NSURLRequestUseProtocolCachePolicy = 0,
  6. NSURLRequestReloadIgnoringLocalCacheData = 1,
  7. NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4,
  8. NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,
  9. NSURLRequestReturnCacheDataElseLoad = 2,
  10. NSURLRequestReturnCacheDataDontLoad = 3,
  11. NSURLRequestReloadRevalidatingCacheData = 5
  12. };
  13. typedef NSUInteger NSURLRequestCachePolicy;

稍微解释一下:

NSURLRequestUseProtocolCachePolicy(基础策略)这个是NSURLRequest的默认策略

NSURLRequestReloadIgnoringLocalCacheData(忽略本地缓存)

NSURLRequestReturnCacheDataElseLoad(首先使用缓存,如果没有本地缓存,才从原地址下载)

NSURLRequestReturnCacheDataDontLoad(使用本地缓存,从不下载,如果本地没有缓存,则请求失败,此策略多用于离线操作)

NSURLRequestReloadIgnoringLocalAndRemoteCacheData(无视任何缓存策略,无论是本地的还是远程的,总是从原地址重新下载)

NSURLRequestReloadRevalidatingCacheData(如果本地缓存是有效的则不下载,其他任何情况都从原地址重新下载)

具体的请参看这一篇博客:http://blog.csdn.net/zeng11088/article/details/8544759(

NSURLRequest的官方文档的译文

3、创建NSURLConnection &  响应

首先,上面讲到网络编程有同步和异步两种连接方式,连接采用同步响应是通过使用sendSynchronousRequest方法实现的,而连接采用异步响应是通过代理NSURLConnectionDelegate的方法实现的
(1)同步连接响应:使用这个方法。

  1. + (NSData *)sendSynchronousRequest:(NSURLRequest *)request  returningResponse:(NSURLResponse **)response  error:(NSError **)error

例如:

  1. NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

(2)异步连接响应:代理实现

创建一个connection之后调用以下相关的代理方法

  1. NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:self];

①Sent when the connection has received sufficient data to construct the URL response for its request.

  1. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

②Sent as a connection loads data incrementally.

  1. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

③Sent when a connection has finished loading successfully

  1. - (void)connectionDidFinishLoading:(NSURLConnection *)connection

④Sent when a connection fails to load its request successfully.

  1. - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

稍微解释一下这个过程:如果connection收到response,就调用delegate中的第①个方法didReceiveResponse方法,这里需要创建一个data缓冲区,这个是第一步。然后一点点接收数据,不断追加到先前创建的data,这个过程会重复调用didReceiveData方法,这个是第二步。如果接受完成,会调用connectionDidFinishLoading这个方法,表示数据全部接收完毕;如果接收数据出现错误或者异常,则会调用didFailWithError这个方法结束,这是第三步。

附:如果网络请求进行了一半时退出程序,大家都知道这时候程序会被挂起,那么网络连接怎么办呢?实际上当程序退出时,系统并不会立即挂起应用进程,而是会延迟大概一秒,如果这样请求还是没有完成,系统底层会默默地帮你把数据都接收完,帮你保存请求超时时间那么久。比如你设置超时时间30s,30s内重新打开应用,数据就立刻全都一次性收到,如果没打开,不好意思,下次打开程序时,delegate的didFailWithError方法会被调用,通知你请求超时了。

ios之NSURLRequest&NSURLConnection的更多相关文章

  1. iOS网络1——NSURLConnection使用详解

    原文在此 一.整体介绍 NSURLConnection是苹果提供的原生网络访问类,但是苹果很快会将其废弃,且由NSURLSession(iOS7以后)来替代.目前使用最广泛的第三方网络框架AFNetw ...

  2. 【iOS基础】NSURLConnection

    一.大文件下载1.方案:利用NSURLConnection和它的代理方法1> 发送一个请求 // 1.URL NSURL *url = [NSURL URLWithString:@"h ...

  3. iOS NSURLSession VS NSURLConnection

    NSURLSession VS NSURLConnection NSURLSession可以看做是NSURLConnection的进化版,其对NSURLConnection的改进点有: * 根据每个S ...

  4. iOS开发系列-NSURLConnection

    概述 NSURLConnection是负责发送请求,建立客户端与服务端的连接.发送数据给服务器,并收集来自服务器的响应数据.其中NSURLRequest类是用来封装一个请求,包含NSURL对象.请求方 ...

  5. iOS 开发笔记-NSURLConnection的使用

    通过NSURLConnection发送一个HTTP GET请求 //send a GET request to server with some params -(void)httpGetWithPa ...

  6. 客户端(android,ios)与服务器通信

    android,ios客户端与服务器通信为了便于理解,直接用PHP作为服务器端语言 其实就是一个 http请求响应的过程序,先从 B/S模式说起浏览器发起http请求,服务器响应请求,并把数据返回给浏 ...

  7. iOS - NSURLConnection 网络请求

    前言 @interface NSURLConnection : NSObject class NSURLConnection : NSObject DEPRECATED: The NSURLConne ...

  8. IOS NSURLConnection(大文件下载)

    NSURL:请求地址 NSURLRequest:一个NSURLRequest对象就代表一个请求,它包含的信息有 一个NSURL对象 请求方法.请求头.请求体 请求超时 … … NSMutableURL ...

  9. 【原】HTTP in iOS你看我就够

    声明:本文是本人 编程小翁 原创,转载请注明. 本文同步发布在简书中,强烈建议移步简书查看,编程小翁 HTTP属于老话题了,在项目中我们经常需要往服务端发POST或者GET请求,但是对于HTTP的了解 ...

随机推荐

  1. bzoj 3996: [TJOI2015]线性代数【最小割】

    把转置矩阵看成逆矩阵吓傻了233 首先按照矩乘推一下式子: \[ D=\sum_{i=1}^n a[i]*(\sum_{j=1}^n a[j]*b[j][i])-c[i] \] \[ D=(\sum_ ...

  2. 【BZOJ4548】小奇的糖果

    →原题传送门←(by Hzwer) 「题目背景」 小奇不小心让糖果散落到了地上,它对着满地的彩色糖果胡思乱想. 「问题描述」 有 N 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或 ...

  3. bzoj1101:[POI2007]ZAP-Queries

    [POI2007]ZAP-Queries 题意简述:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d. Solution 很显然这是一个莫比 ...

  4. 设置DataTable行属性

    dt.Columns["ColumnName"].DataType=Type.GetType("System.bool");

  5. VLAN-2-私有VLAN

          好的设计方式通常要求工程师为每个vlan使用一个ip子网.然而在有些情况下,将设备分割到许多小VLAN中以增加安全性的需求,与节省可用子网的目标相互冲突.通过使用私有vlan,交换机能够分 ...

  6. [題解](單調隊列/水)luogu_P3088擠奶牛

    d長度內區間最大值,單調隊列維護即可 由於需要滿足左右同時有2倍高度的牛才能更新答案,所以正反跑兩次 #include<bits/stdc++.h> using namespace std ...

  7. Codeforces 526G Spiders Evil Plan

    由于做的时候看的是中文题面,第一遍写就被卡题意了:还以为每一条都要过x,那么就是一道动态树根选择2y个叶子的奇怪题目 交完0分gg,才发现题目看错了╮(╯▽╰)╭ the node containin ...

  8. C8051F单片机定时器的定时

    假设C8051F020单片机的晶振是sysclk=22114800HZ,即每秒计22114800个数经过Div=12分频后得到定时器的计数频率Tclk=sysclk/12,每秒计22114800÷12 ...

  9. TDH-kafka

    一.kafka原理:1.broker:一个kafka实例,多个broker组成kafka集群: 2.topic:逻辑概念,同一类数据的集合,可以看做一张表: 3.producer:将数据写入topic ...

  10. SVM为什么需要核函数

    生存?还是毁灭?——哈姆雷特 可分?还是不可分?——支持向量机 之前一直在讨论的线性分类器,器如其名(汗,这是什么说法啊),只能对线性可分的样本做处理.如果提供的样本线性不可分,结果很简单,线性分类器 ...