同步与异步调用http请求 iphone开发

异步: 

NSMutableData* buf = [[NSMutableData alloc] initWithLength:0];

NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:req delegate:self];
 
// 收到响应时, 会触发
- (void)connection:(NSURLConnection *)aConnection didReceiveResponse:(NSURLResponse *)aResponse;
// 你可以在里面判断返回结果, 或者处理返回的http头中的信息
 
// 每收到一次数据, 会调用一次
- (void)connection:(NSURLConnection *)aConn didReceiveData:(NSData *)data;
// 因此一般来说,是
- (void)connection:(NSURLConnection *)aConn didReceiveData:(NSData *)data
{
[buf appendData:data];
}
// 当然buffer就是前面initWithRequest时同时声明的.
 
// 网络错误时触发
- (void)connection:(NSURLConnection *)aConn didFailWithError:(NSError *)error;
 
// 全部数据接收完毕时触发
- (void)connectionDidFinishLoading:(NSURLConnection *)aConn;
 
异步请求代码
复制代码
//.h file:
//
//  DownloadHelper.h
//  BigViewApp
//
//  Created by lu Yinghuai on 11-2-14.
//  Copyright 2011 minesage. All rights reserved.
//

#import 
<Foundation/Foundation.h>
@protocol DownloadHelperDelegate;

@interface DownloadHelper : NSObject {
    @private
    
    NSURLConnection         
*appListFeedConnection;
    NSMutableData           
*appListData;
    NSString 
*strResultData;
    
    id 
<DownloadHelperDelegate> delegate;
}

-(id)initWithDelegate: (id <DownloadHelperDelegate>)theDelegate;
-(void) startDownload: (NSString *) targetUrl;
 
@property (nonatomic, assign) id 
<DownloadHelperDelegate> delegate;
@property (nonatomic, retain) NSURLConnection 
*appListFeedConnection;
@property (nonatomic, retain) NSMutableData 
*appListData;
@property (nonatomic, retain) NSString 
*strResultData;

@end

@protocol DownloadHelperDelegate
- (void)didFinishDownload:(NSString *) strResult;
- (void)downloadErrorOccurred:(NSError *) error;
@end


//.m file

//
//  DownloadHelper.m
//  BigViewApp
//
//  Created by lu Yinghuai on 11-2-14.
//  Copyright 2011 minesage. All rights reserved.
//

#import 
"DownloadHelper.h"


@implementation DownloadHelper

@synthesize appListFeedConnection, appListData,
delegate,strResultData;

- (id)initWithDelegate:(id <DownloadHelperDelegate>)theDelegate
{
    self 
= [super init];
    
if (self != nil)
    { 
        self.
delegate = theDelegate;
        
//strResultData = [[NSString alloc] init];
    }
    
return self;
}

-(void) startDownload: (NSString *) targetUrl {
    NSURLRequest 
*urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:targetUrl]];
    self.appListFeedConnection 
= [[[NSURLConnection alloc] initWithRequest:urlRequest delegate:self] autorelease];
    
    
// Test the validity of the connection object. The most likely reason for the connection object
    
// to be nil is a malformed URL, which is a programmatic error easily detected during development
    
// If the URL is more dynamic, then you should implement a more flexible validation technique, and
    
// be able to both recover from errors and communicate problems to the user in an unobtrusive manner.
    
//
    NSAssert(self.appListFeedConnection != nil, @"Failure to create URL connection.");
    
    
// show in the status bar that network activity is starting
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

#pragma mark -
#pragma mark NSURLConnection delegate methods

// -------------------------------------------------------------------------------
//    handleError:error
// -------------------------------------------------------------------------------
- (void)handleError:(NSError *)error
{
    
/*NSString *errorMessage = [error localizedDescription];
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Cannot Show Top Paid Apps"
                                                        message:errorMessage
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
    [alertView show];
    [alertView release];
*/
    
    [
delegate downloadErrorOccurred:error];
}

// The following are delegate methods for NSURLConnection. Similar to callback functions, this is how
// the connection object,  which is working in the background, can asynchronously communicate back to
// its delegate on the thread from which it was started - in this case, the main thread.
//

// -------------------------------------------------------------------------------
//    connection:didReceiveResponse:response
// -------------------------------------------------------------------------------
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    self.appListData 
= [NSMutableData data];    // start off with new data
}

// -------------------------------------------------------------------------------
//    connection:didReceiveData:data
// -------------------------------------------------------------------------------
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [appListData appendData:data];  
// append incoming data
}

// -------------------------------------------------------------------------------
//    connection:didFailWithError:error
// -------------------------------------------------------------------------------
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible 
= NO;
    
    
if ([error code] == kCFURLErrorNotConnectedToInternet)
    {
        
// if we can identify the error, we can present a more precise message to the user.
        NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"No Connection Error"
                                                             forKey:NSLocalizedDescriptionKey];
        NSError 
*noConnectionError = [NSError errorWithDomain:NSCocoaErrorDomain
                                                         code:kCFURLErrorNotConnectedToInternet
                                                     userInfo:userInfo];
        [self handleError:noConnectionError];
    }
    
else
    {
        
// otherwise handle the error generically
        [self handleError:error];
    }
    
    self.appListFeedConnection 
= nil;   // release our connection
}

// -------------------------------------------------------------------------------
//    connectionDidFinishLoading:connection
// -------------------------------------------------------------------------------
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    self.appListFeedConnection 
= nil;   // release our connection
    
    [UIApplication sharedApplication].networkActivityIndicatorVisible 
= NO;   
    
    strResultData 
= [[NSString alloc] initWithData:appListData encoding:NSASCIIStringEncoding];
    NSLog(
@"%@",strResultData);
    
    [
delegate didFinishDownload:strResultData];
    
    self.appListData 
= nil;
}

// -------------------------------------------------------------------------------
//    dealloc
// -------------------------------------------------------------------------------
- (void)dealloc
{
    [appListFeedConnection release];
    [appListData release];
    [strResultData release];

       [super dealloc];
}


@end


//.m 调用代码
.实例化:
//download 排行榜
        downLoadHelper = [[DownloadHelper alloc] initWithDelegate:self];
.//下载排行榜数据
    [downLoadHelper startDownload: @"http://www.google.com/trends/hottrends/atom/hourly"];
.委托对象回调方法
#pragma mark ------ DownloadHelper Delegate Method ------
- (void) didFinishDownload:(NSString *) strResult{
    NSLog(
@"didFinishDownload");
    
    [hotTrend.keyWordRecordList removeAllObjects];
    
    NSLog(
@"%@",strResult);
}

-(void) downloadErrorOccurred:(NSError *) error{
    NSLog(
@"downloadErrorOccurred");
}
        
复制代码
第二段是同步请求
 
 
 
 
 
 
 
 
 
 
,~
// 初始化请求
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];         
// 设置URL
[request setURL:[NSURL URLWithString:urlStr]];
// 设置HTTP方法
[request setHTTPMethod:@"GET"];
// 发 送同步请求, 这里得returnData就是返回得数据了
NSData *returnData = [NSURLConnection sendSynchronousRequest:request 
returningResponse:nil error:nil]; 
// 释放对象
[request release];
原文地址:https://www.cnblogs.com/zhwl/p/2587656.html