NSURLConnection
1、异步请求
iOS5.0 SDK NSURLConnection类新增的sendAsynchronousRequest:queue:completionHandler:方法,从而使iOS5支持两种异步请求方式。我们先从新增类开始。
1)sendAsynchronousRequest
iOS5.0开始支持sendAsynchronousReques方法,方法使用如下:
[cpp] view plaincopyprint?
- - (void)httpAsynchronousRequest{
 - NSURL *url = [NSURL URLWithString:@"http://url"];
 - NSString *post=@"postData";
 - NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
 - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
 - [request setHTTPMethod:@"POST"];
 - [request setHTTPBody:postData];
 - [request setTimeoutInterval:10.0];
 - NSOperationQueue *queue = [[NSOperationQueue alloc]init];
 - [NSURLConnection sendAsynchronousRequest:request
 - queue:queue
 - completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
 - if (error) {
 - NSLog(@"Httperror:%@%d", error.localizedDescription,error.code);
 - }else{
 - NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];
 - NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
 - NSLog(@"HttpResponseCode:%d", responseCode);
 - NSLog(@"HttpResponseBody %@",responseString);
 - }
 - }];
 - }
 
sendAsynchronousReques可以很容易地使用NSURLRequest接收回调,完成http通信。
2)connectionWithRequest
iOS2.0就开始支持connectionWithRequest方法,使用如下:
[cpp] view plaincopyprint?
- - (void)httpConnectionWithRequest{
 - NSString *URLPath = [NSString stringWithFormat:@"http://url"];
 - NSURL *URL = [NSURL URLWithString:URLPath];
 - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
 - [NSURLConnection connectionWithRequest:request delegate:self];
 - }
 - - (void)connection:(NSURLConnection *)theConnection didReceiveResponse:(NSURLResponse *)response
 - {
 - NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];
 - NSLog(@"response length=%lld statecode%d", [response expectedContentLength],responseCode);
 - }
 - // A delegate method called by the NSURLConnection as data arrives. The
 - // response data for a POST is only for useful for debugging purposes,
 - // so we just drop it on the floor.
 - - (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data
 - {
 - if (mData == nil) {
 - mData = [[NSMutableData alloc] initWithData:data];
 - } else {
 - [mData appendData:data];
 - }
 - NSLog(@"response connection");
 - }
 - // A delegate method called by the NSURLConnection if the connection fails.
 - // We shut down the connection and display the failure. Production quality code
 - // would either display or log the actual error.
 - - (void)connection:(NSURLConnection *)theConnection didFailWithError:(NSError *)error
 - {
 - NSLog(@"response error%@", [error localizedFailureReason]);
 - }
 - // A delegate method called by the NSURLConnection when the connection has been
 - // done successfully. We shut down the connection with a nil status, which
 - // causes the image to be displayed.
 - - (void)connectionDidFinishLoading:(NSURLConnection *)theConnection
 - {
 - NSString *responseString = [[NSString alloc] initWithData:mData encoding:NSUTF8StringEncoding];
 - NSLog(@"response body%@", responseString);
 - }
 
connectionWithRequest需要delegate参数,通过一个delegate来做数据的下载以及Request的接受以及连接状态,此处delegate:self,所以需要本类实现一些方法,并且定义mData做数据的接受。
需要实现的方法:
1、获取返回状态、包头信息。
[cpp] view plaincopyprint?
- - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
 
2、连接失败,包含失败。
[cpp] view plaincopyprint?
- - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
 
3、接收数据
[cpp] view plaincopyprint?
- - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
 
4、数据接收完毕
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
connectionWithRequest使用起来比较繁琐,而iOS5.0之前用不支持sendAsynchronousRequest。有网友提出了AEURLConnection解决方案。
[html] view plaincopyprint?
- AEURLConnection is a simple reimplementation of the API for use on iOS 4. Used properly, it is also guaranteed to be safe against The Deallocation Problem, a thorny threading issue that affects most other networking libraries.
 
2、同步请求
同步请求数据方法如下:
[cpp] view plaincopyprint?
- - (void)httpSynchronousRequest{
 - NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]];
 - NSURLResponse * response = nil;
 - NSError * error = nil;
 - NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
 - returningResponse:&response
 - error:&error];
 - if (error == nil)
 - {
 - // 处理数据
 - }
 - }
 
同步请求数据会造成主线程阻塞,通常在请求大数据或网络不畅时不建议使用。
从上面的代码可以看出,不管同步请求还是异步请求,建立通信的步骤基本是一样的:
1、创建NSURL
2、创建Request对象
3、创建NSURLConnection连接。
NSURLConnection创建成功后,就创建了一个http连接。异步请求和同步请求的区别是:创建了异步请求,用户可以做其他的操作,请求会在另一个线程执行,通信结果及过程会在回调函数中执行。同步请求则不同,需要请求结束用户才能做其他的操作。
                    
                
                
            
        
浙公网安备 33010602011771号