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

    技术2022-05-18  22

    同步与异步调用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; ,~ //  初始化请求 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];

    异步请求代码 // .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 " );}        

     

    第二段是同步请求

    最新回复(0)