iOS使用NSURLConnection发送同步和异步HTTP Request

1. 同步发送

- (NSString *)sendRequestSync

{

// 初始化请求, 这里是变长的, 方便扩展

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

// 设置

[request setURL:[NSURL URLWithString:urlStr]];

[request setHTTPMethod:@"POST"];

[request setValue:host forHTTPHeaderField:@"Host"];

NSString *contentLength = [NSString stringWithFormat:@"%d", [content length]];

[request setValue:contentLength forHTTPHeaderField:@"Content-Length"];

[request setHTTPBody:content];

// 发送同步请求, data就是返回的数据

NSError *error = nil;

NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];

if (data == nil) {

NSLog(@"send request failed: %@", error);

return nil;

}

NSString *response = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"response: %@", response);

return response;

}

2.异步发送

 

1) 使用delegate的方式:

- (void)sendRequestAsync

{

// 初始化请求

NSMutableURLRequest  *request = [[NSMutableURLRequest alloc] init];

// 设置

[request setURL:[NSURL URLWithString:urlStr]];

[request setCachePolicy:NSURLRequestUseProtocolCachePolicy]; // 设置缓存策略

[request setTimeoutInterval:5.0]; // 设置超时

//......

receivedData = [[NSMutableData alloc] initData: nil];

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

if (connection == nil) {

// 创建失败

return;

}

}

异步发送使用代理的方式, 需要实现以下delegate接口:

// 收到回应

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

{

NSLog(@"receive the response");

// 注意这里将NSURLResponse对象转换成NSHTTPURLResponse对象才能去

NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;

if ([response respondsToSelector:@selector(allHeaderFields)]) {

NSDictionary *dictionary = [httpResponse allHeaderFields];

NSLog(@"allHeaderFields: %@",dictionary);

}

[receivedData setLength:0];

}

// 接收数据

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

{

NSLog(@"get some data");

[receivedData appendData:data];

}

// 数据接收完毕

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

{

NSString *results = [[NSString alloc]

initWithBytes:[receivedData bytes]

length:[receivedData length]

encoding:NSUTF8StringEncoding];

NSLog(@"connectionDidFinishLoading: %@",results);

}

// 返回错误

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

{

NSLog(@"Connection failed: %@", error);

}

2) iOS 5.0版本新增异步发送接口:

+ (void)sendAsynchronousRequest:(NSURLRequest *)request

queue:(NSOperationQueue*) queue

completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*)) handlerNS_AVAILABLE(10_7, 5_0);

时间: 2024-10-29 21:53:47

iOS使用NSURLConnection发送同步和异步HTTP Request的相关文章

测试iOS的Notification是同步还是异步

面试被问到这个问题,不是很清楚,写代码测试并记录一下. #pragma mark - 测试通知-(void)testNotification{    // 初始化一个按钮    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 50)];    button.backgroundColor = [UIColor orangeColor];    [button setTitle:@"触发通知&

iOS网络编程之同步、异步、请求队列 2014-12-7

1. 同步意为着线程阻塞,在主线程中使用此方法会不响应任何用户事件.所以,在应用程序设计时,大多被用在专门的子线程增加用户体验,或用异步请求代替. - (IBAction)grabURL:(id)sender { NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request star

iOS网络: NSURLConnection进行同步下载

通过 NSURLConnection 的 sendSynchronousRequest:returningResponse:error: 方法创建一 个同步的网络连接.这个方法将会返回一个 NSData 类型的数据 在创建一个同步的网络连接的时候我们需要明白一点,并不是是我们 的这个同步连接一定会堵塞我们的主线程,如果这个同步的连接是创建在主线程上的,那么 这种情况下是会堵塞我们的主线程的,其他的情况下是不一定会堵塞我们的主线程的.如果你在 GCD 的全局并发队列上初始化了一个同步的连接,你其实

ASIHTTPRequest框架使用(1)--发送同步请求

ASIHTTPRequest框架是优秀的第三方OC的HTTP框架,支持Mac OS X和iOS下得HTTP开发. 具有如下优点: 1.支持下载数据放在内存或本地文件 2.容易访问请求和应答HTTP Header 3.支持Cookie 4.支持GZip请求或应答(?) 5.支持缓存 6.支持同步或异步请求 7.支持HTTPs 但是,ASIHTTPRequest不支持ARC. 配置ASI框架:向项目中导入ASI框架之后,还要向工程中引入一些框架和类库: CFNetwork.framework,Sys

ios开发网络学习:一:NSURLConnection发送GET,POST请求

#import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> /** 注释 */ @property (nonatomic, strong) NSMutableData *resultData; @end @implementation ViewController #pragma mark ---------------------- #pragma mark la

[IOS_HTTP]NSURLConnection同步与异步请求

今天看到<WIN32多线程程序设计>的同步控制时,才发现原来自己对同步和异步的概念很模糊,甚至混淆.于是GOOGLE了一下.下面都是高人们的见解,简单明了. 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式.  异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式. 举个不太恰当的例子,就像:  SendMessage(...)  TRACE0("just  like  send");   PostMessage(...) 

iOS上的http请求:get、post以及同步、异步

1.get: view sourceprint? 01.<span style="font-size:14px;">NSString * URLString = @"http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode=广东"; 02.NSURL * URL = [NSURL URLWithString:[URLStri

IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)

进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 队列 dispatch_queue_t,队列名称在调试时辅助,无论什么队列和任务,线程的创建和回收不需要程序员操作,有队列负责. 串行队列:队列中的任务只会顺序执行(类似跑步) dispatch_queue_t q = dispatch_queue_create(“....”, DISPATCH_QUEUE_SER

NSURLConnection同步和异步连接

NSURLConnection去加载一个URL请求时候有两种方式,一种是同步加载,一种是异步加载. 同步加载会阻塞当前的那个线程,如果将同步加载的代码放在主线程里去执行,那么就会阻塞主线程. 异步加载一种方式使用的是block,就算将加载的代码放到主线程去执行,也不会阻塞主线程.异步加载的另一种方式比较灵活.它可以在你需要的时候去启动,在你不需要的时候可以取消. 先看一个在主线程种同步和异步,以及使用GCD同步三种方式加载数据的阻塞情况 // // AppDelegate.m // NSURLC