• 同步与异步调用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];
  • 相关阅读:
    jquery插件
    Bash Shell实用快捷键
    Cisco SG300系列交换机划分VLan与普通路由器连接配置
    PostgreSQL用户角色及其属性介绍
    Ubuntu 10.04 32位桌面版+OpnERP 6.1.1
    Postgresql 帐号密码修改方法
    linux查找日志技巧
    Python 黑魔法 --- 描述器(descriptor)
    Nginx如何保留真实IP和获取前端IP
    Nginx 配置 SSL 证书 + 搭建 HTTPS 网站教程
  • 原文地址:https://www.cnblogs.com/zhwl/p/2587656.html
Copyright © 2020-2023  润新知