NSURLRequest和NSURLConnection的使用

本文深入探讨了如何使用NSURLRequest和NSURLConnection在iOS应用中进行网络请求,包括请求策略的选择、数据接收处理及同步异步请求方法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

URLRequest 的一个实例

[html]  view plain copy
  1. // Create the request.  
  2. //所构建的NSURLRequest具有一个依赖于缓存响应的特定策略,cachePolicy取得策略,timeoutInterval取得超时值  
  3. NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"

    http://www.weather.com.cn/data/cityinfo/101110101.html

    "]  
  4.                         cachePolicy:NSURLRequestUseProtocolCachePolicy  
  5.                     timeoutInterval:60.0];  
  6. // create the connection with the request  
  7. // and start loading the data  
  8. NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];  
  9. if (theConnection) {  
  10.     // Create the NSMutableData to hold the received data.  
  11.     // receivedData is an instance variable declared elsewhere.  
  12.     receivedData = [[NSMutableData data] retain];  
  13. } else {  
  14.     // Inform the user that the connection failed.  
  15. }  


其中:
NSURLRequest默认的cache policy是 NSURLRequestUseProtocolCachePolicy, 是最能保持一致性的协议。
NSURLRequestReloadIgnoringCacheData 忽略缓存直接从原始地址下载
NSURLRequestReturnCacheDataElseLoad 只有在cache中不存在data时才从原始地址下载
NSURLRequestReturnCacheDataDontLoad 允许app确定是否要返回cache数据,如果使用这种协议当本地不存在response的时候,创建NSURLConnection or NSURLDownload实例时将会马上返回nil;这类似于离线模式,没有建立网络连接;

你只需要实现以下delegate方法来处理数据响应

- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSHTTPURLResponse*)response

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

redata=(NSMutableData*)data;

    NSString *tmp=[[NSStringalloc] initWithData:redata encoding:NSUTF8StringEncoding];

    NSLog(@"%@",tmp);

    // 返回一个JSON对象 使用jsonkit对数据进行转化

    NSDictionary *json=[redataobjectFromJSONData];

   //对字典数据进行操作

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

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

NSURLConnect还提供了一个方便的类方法(class method) : sendSynchronousRequest:returningResponse:error:可用来 同步地加载一个URL请求

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

  • request 要装载的URL请求. 这个request 对象 作为初始化进程的一部分,被深度复制(deep-copied). 在这个方法返回之后, 再修改request, 将不会影响用在装载的过程中的request
  • reponse 输出参数, 由服务器返回的URL响应
  • error   输出参数, 如果在处理请求的过程中发生错误,就会使用.  无错误,就为NULL
一个实现同步Get请求的例子:
[html]  view plain copy
  1. // 初始化请求  
  2. NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];           
  3. // 设置URL  
  4. [request setURL:[NSURL URLWithString:urlStr]];  
  5. // 设置HTTP方法  
  6. [request setHTTPMethod:@"GET"];  
  7. // 发 送同步请求, 这里得returnData就是返回得数据了  
  8. NSData *returnData = [NSURLConnection sendSynchronousRequest:request   
  9.                                            returningResponse:nil error:nil];   
  10. // 释放对象  
  11. [request release]; 

一个实现异步get请求的例子:
[cpp]  view plain copy
  1. NSString *url = [NSString stringWithFormat:@"http://localhost/chat/messages.php?past=%ld&t=%ld",  
  2.                      lastId, time(0) ];  
  3.       
  4.     NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];  
  5.     [request setURL:[NSURL URLWithString:url]];  
  6.     [request setHTTPMethod:@"GET"];  
  7.   
  8.     NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:request delegate:self];    
  9.     if (conn)  
  10.     {    
  11.         receivedData = [[NSMutableData data] retain];    
  12.     }     
  13.     else     
  14.     {    
  15.     }   
  16.   
  17.   
  18. - (void)timerCallback {  
  19.     //[timer release];  
  20.     [self getNewMessages];  
  21. }  
  22.   
  23. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response    
  24. {    
  25.     [receivedData setLength:0];    
  26. }    
  27.   
  28. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data    
  29. {    
  30.     [receivedData appendData:data];    
  31.     对数据进行操作
  32. }    
  33.   
  34. - (void)connectionDidFinishLoading:(NSURLConnection *)connection    
  35. {    
  36.     
  37. }   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值