同步与异步调用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];

你可能感兴趣的:(iPhone开发)