发2个基于ASIHttpRequest的多任务异步网络传输类

代码写的不是很规范,大家可以拿过去直接改

功能:

上传,下载数据。支持进度显示。

多网络任务异步封装。

采用block处理。

所以需要5.0以上的系统。


具体使用示例:


第一个是第一次使用时候封装。


//
//  CWLWConnectManager.h
//  LechaoDrawGuess
//
//  Created by luoge on 12-11-19.
//  Copyright (c) 2012年 watsy. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ASIHTTPRequest.h"
#import "ASIFormDataRequest.h"

typedef enum {
    connectType_GET = 0,
    connectType_POST
} connectType;

@interface CWLWConnectManager : NSObject

+ (CWLWConnectManager *) sharedInstance;
+ (void) releaseInstance;

//投递方法
- (NSUInteger) conURL:(NSString *) sURL
          connectType:(connectType) cType
               params:(NSDictionary *) params
             delegate:(id) del;

- (NSUInteger) conURL:(NSString *) sURL
          connectType:(connectType) cType
               params:(NSDictionary *) params
             delegate:(id) del
                  tag:(NSInteger) nTag;

- (NSUInteger) conURL:(NSString *) sURL
          connectType:(connectType) cType
               params:(NSDictionary *) params
             delegate:(id) del
                  tag:(NSInteger) nTag
                  key:(NSString *) sKey;


#if NS_BLOCKS_AVAILABLE

- (NSUInteger) conURL:(NSString *) sURL
          connectType:(connectType) cType
               params:(NSDictionary *) params
               result:(void(^)(BOOL bSuccess,id returnData,NSError *error)) block;

- (NSUInteger) conURL:(NSString *) sURL
          connectType:(connectType) cType
               params:(NSDictionary *) params
                  tag:(NSInteger) nTag
               result:(void(^)(BOOL bSuccess,id returnData,NSError *error,NSInteger nTag)) block;

- (NSUInteger) conURL:(NSString *) sURL
          connectType:(connectType) cType
               params:(NSDictionary *) params
                  tag:(NSInteger) nTag
                  key:(NSString *) sKey
               result:(void(^)(BOOL bSuccess,id returnData,NSError *error,NSInteger nTag, NSString *skey)) block;

#endif

//取消网络连接
- (BOOL) cancelWithHashValue:(NSUInteger) nItemHashValue;
- (BOOL) cancelURL:(NSString *) sURL
       connectType:(connectType) cType
            params:(NSDictionary *) params
          delegate:(id) del
               tag:(NSInteger) nTag
               key:(NSString *) sKey;

@end


@interface NSObject(CWLCConnection)

- (void) didCWFinishSuccessedWithData:(id) data
                                  tag:(NSInteger) nTag
                                  key:(NSString *) sKey;
- (void) didCWFinishFailedWithError:(NSError *) error
                                tag:(NSInteger) nTag
                                key:(NSString *) sKey;
@end

//
//  CWLWConnectManager.m
//  LechaoDrawGuess
//
//  Created by luoge on 12-11-19.
//  Copyright (c) 2012年 watsy. All rights reserved.
//

#import "CWLWConnectManager.h"

static CWLWConnectManager *_pConnectionMgr_ = nil;

@interface CWConnItem : NSObject <ASIHTTPRequestDelegate>
@property (nonatomic, assign) connectType cType;
@property (nonatomic, assign) NSInteger nTag;
@property (nonatomic, strong) NSString  *sKey;
@property (nonatomic, assign) id delegate;
@property (nonatomic, strong) NSString *sURL;
@property (nonatomic, strong) NSDictionary *params;
@property (nonatomic, strong) ASIHTTPRequest *httpReq;

+ (CWConnItem *) connWithtype:(connectType) ct
                          url:(NSString *) sl
                       params:(NSDictionary *) pd
                          Tag:(NSInteger) nt
                          key:(NSString *) sk
                     delegate:(id) del;

- (CWConnItem *) initWithtype:(connectType) ct
                          url:(NSString *) sl
                       params:(NSDictionary *) pd
                          Tag:(NSInteger) nt
                          key:(NSString *) sk
        blockWithOutTagAndKey:(void(^)(BOOL bSuccess,id returnData,NSError *error)) blockWithOutTagAndKey
              blockWithOutKey:(void(^)(BOOL bSuccess,id returnData,NSError *error,NSInteger nTag)) blockWithOutKey
                        block:(void(^)(BOOL bSuccess,id returnData,NSError *error,NSInteger nTag, NSString *skey)) block;
- (void) start;

@end

@implementation CWConnItem
@synthesize nTag,sKey,delegate,sURL,cType,params;
@synthesize httpReq;

- (void) dealloc
{
    [httpReq clearDelegatesAndCancel];
    [httpReq release];
    
    [params release];
    [sURL release];
    [sKey release];
    [super dealloc];
}

+ (CWConnItem *) connWithtype:(connectType) ct
                          url:(NSString *) sl
                       params:(NSDictionary *) pd
                          Tag:(NSInteger) nt
                          key:(NSString *) sk
                     delegate:(id) del
{
    CWConnItem *item = [[CWConnItem alloc] init];
    item.nTag = nt;
    item.sKey = sk;
    item.sURL = sl;
    item.delegate = del;
    item.cType = ct;
    item.params = pd;
    return [item autorelease];
}

- (CWConnItem *) initWithtype:(connectType) ct
                          url:(NSString *) sl
                       params:(NSDictionary *) pd
                          Tag:(NSInteger) nt
                          key:(NSString *) sk
        blockWithOutTagAndKey:(void(^)(BOOL bSuccess,id returnData,NSError *error)) blockWithOutTagAndKey
              blockWithOutKey:(void(^)(BOOL bSuccess,id returnData,NSError *error,NSInteger nTag)) blockWithOutKey
                        block:(void(^)(BOOL bSuccess,id returnData,NSError *error,NSInteger nTag, NSString *skey)) block
{
    if (self = [super init])
    {
        self.nTag = nt;
        self.sKey = sk;
        self.sURL = sl;
        self.cType = ct;
        self.params = pd;
        
        if (cType == connectType_GET)
        {
            self.httpReq = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:sURL]];
            [httpReq setRequestMethod:@"GET"];
        }
        else if (cType == connectType_POST)
        {
            self.httpReq = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:sURL]];
            [httpReq setRequestMethod:@"POST"];
            ASIFormDataRequest *form = (ASIFormDataRequest *) httpReq;
            for (NSString *paramKey in [params allKeys])
            {
                id paramValue = [params objectForKey:paramKey];
                if ([paramValue isKindOfClass:[NSString class]])
                {
                    [form addPostValue:paramValue forKey:paramKey];
                }
                else if ([paramValue isKindOfClass:[NSNumber class]])
                {
                    [form addPostValue:[paramValue stringValue] forKey:paramKey];
                }
            
            }
        }

        [httpReq setCompletionBlock:^(void)
        {
            JSONDecoder *dec = [[JSONDecoder alloc] initWithParseOptions:JKParseOptionNone];
            NSError *errParser = nil;
            id parObj = [dec objectWithData:httpReq.responseData error:&errParser];
            
            //如果没有tag和key
            if (blockWithOutTagAndKey)
            {
                if (!errParser)
                {
                    blockWithOutTagAndKey(YES, parObj, nil);
                }
                else
                {
                    blockWithOutTagAndKey(NO, nil, errParser);
                }
            }
            //如果没有key
            if (blockWithOutKey)
            {
                if (!errParser)
                {
                    blockWithOutKey(YES, parObj, nil, nTag);
                }
                else
                {
                    blockWithOutKey(NO, nil, errParser, nTag);
                }
            }
            
            if (block)
            {
                if (!errParser)
                {
                    block(YES, parObj, nil, self.nTag, self.sKey);
                }
                else
                {
                    block(NO, nil, errParser, self.nTag, self.sKey);
                }
            
            }
            
            if([[CWLWConnectManager sharedInstance] respondsToSelector:@selector(didFinishedWithItems:error:)])
            {
                [[CWLWConnectManager sharedInstance] performSelector:@selector(didFinishedWithItems:error:)
                                                          withObject:self
                                                          withObject:nil];
            }
            
            [dec release];
            
        }];

        [httpReq setFailedBlock:^(void)
         {
            if (blockWithOutTagAndKey)
            {
                blockWithOutTagAndKey(NO, httpReq.responseString, httpReq.error);
            }
            
            if (blockWithOutKey)
            {
                blockWithOutKey(NO, httpReq.responseString, httpReq.error, nTag);
            }
            
            if (block)
            {
                block(NO, httpReq.responseString, httpReq.error, self.nTag, self.sKey);
            }

            if([[CWLWConnectManager sharedInstance] respondsToSelector:@selector(didFinishedWithItems:error:)])
            {
                [[CWLWConnectManager sharedInstance] performSelector:@selector(didFinishedWithItems:error:)
                                                          withObject:self
                                                          withObject:httpReq.error];
            }
        }];
        
        [httpReq start];
    }
    return self;
}

- (void) start {
    NSAssert((sURL != nil), @"url can't be nil");
    
    sURL = [sURL stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    if (cType == connectType_GET) {
        httpReq = [[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:sURL]];
        [httpReq setRequestMethod:@"GET"];
    } else if (cType == connectType_POST) {
        httpReq = [[ASIFormDataRequest alloc] initWithURL:[NSURL URLWithString:sURL]];
        [httpReq setRequestMethod:@"POST"];
        ASIFormDataRequest *form = (ASIFormDataRequest *) httpReq;
        for (NSString *paramKey in [params allKeys]) {
            [form addPostValue:[params objectForKey:paramKey] forKey:paramKey];
        }
    }
    httpReq.delegate = self;
    [httpReq startAsynchronous];
}

- (BOOL) isEqual:(id)object {
    CWConnItem *item = (CWConnItem *)object;
    if (![self.sURL isEqualToString:item.sURL]) {
        return NO;
    }
    if (self.cType != item.cType) {
        return NO;
    }
    if (self.delegate != item.delegate) {
        return NO;
    }
    if (self.nTag != item.nTag) {
        return NO;
    }
    if (self.sKey != nil && item.sKey != nil &&
        ![self.sKey isEqualToString:item.sKey]) {
        return NO;
    }
    for (NSString *paramKey in self.params) {
        id sp1 = [self.params objectForKey:paramKey];
        id sp2 = [self.params objectForKey:paramKey];
        if (sp2 == nil) {
            return NO;
        }
        if (![sp1 isEqual:sp2]) {
            return NO;
        }
    }
    return YES;
}

- (void)requestFinished:(ASIHTTPRequest *)request {
    if([[CWLWConnectManager sharedInstance] respondsToSelector:@selector(didFinishedWithItems:error:)]) {
        [[CWLWConnectManager sharedInstance] performSelector:@selector(didFinishedWithItems:error:)
                                                  withObject:self
                                                  withObject:nil];
    }
}
- (void)requestFailed:(ASIHTTPRequest *)request {
    if([[CWLWConnectManager sharedInstance] respondsToSelector:@selector(didFinishedWithItems:error:)]) {
        [[CWLWConnectManager sharedInstance] performSelector:@selector(didFinishedWithItems:error:)
                                                  withObject:self
                                                  withObject:request.error];
    }
}

@end


#pragma mark - CWLWConnectManager
@interface CWLWConnectManager()
@property (nonatomic, strong) NSMutableDictionary *connItems;

//移除元素
- (id) hasItem:(CWConnItem *) item;
- (void) removeItems:(CWConnItem *) conn;
- (void) didFinishedWithItems:(CWConnItem *) conn
                        error:(NSError *) error;

@end

@implementation CWLWConnectManager

@synthesize connItems;

- (id) init {
    if (_pConnectionMgr_) {
        return _pConnectionMgr_;
    }
    if (self = [super init]) {
        self.connItems = [NSMutableDictionary dictionary];
    }
    return self;
}
- (void) dealloc {
    [connItems release];
    [super dealloc];
}

+ (CWLWConnectManager *) sharedInstance {
    if (_pConnectionMgr_ == nil) {
        _pConnectionMgr_ = [[CWLWConnectManager alloc] init];
    }
    return _pConnectionMgr_;
}

+ (void) releaseInstance {
    if (_pConnectionMgr_ != nil) {
        [_pConnectionMgr_ release];
        _pConnectionMgr_ = nil;
    }
}

- (NSUInteger) conURL:(NSString *) sURL
          connectType:(connectType) cType
               params:(NSDictionary *) params
             delegate:(id) del {
    return [self conURL:sURL
            connectType:cType
                 params:params
               delegate:del
                    tag:0];
}

- (NSUInteger) conURL:(NSString *) sURL
          connectType:(connectType) cType
               params:(NSDictionary *) params
             delegate:(id) del
                  tag:(NSInteger) nTag {
    return [self conURL:sURL
            connectType:cType
                 params:params
               delegate:del
                    tag:nTag
                    key:nil];
}

- (NSUInteger) conURL:(NSString *) sURL
          connectType:(connectType) cType
               params:(NSDictionary *) params
             delegate:(id) del
                  tag:(NSInteger) nTag
                  key:(NSString *) sKey {
    
    CWConnItem *item = [CWConnItem connWithtype:cType
                                            url:sURL
                                         params:params
                                            Tag:nTag
                                            key:sKey
                                       delegate:del];
    if ([self hasItem:item]) {
        //重复调用方法
    }
    NSUInteger hashValue = [item hash];
    [self.connItems setObject:item forKey:[NSNumber numberWithUnsignedInteger:hashValue]];
    [item start];

    return hashValue;
}

//取消网络连接
- (BOOL) cancelWithHashValue:(NSUInteger) nItemHashValue {
    CWConnItem *conn = [self.connItems objectForKey:[NSNumber numberWithUnsignedInteger:nItemHashValue]];
    if (conn) {
        [conn.httpReq clearDelegatesAndCancel];
        [self.connItems removeObjectForKey:[NSNumber numberWithUnsignedInteger:nItemHashValue]];
    }
    
    return YES;
}

- (BOOL) cancelURL:(NSString *) sURL
       connectType:(connectType) cType
            params:(NSDictionary *) params
          delegate:(id) del
               tag:(NSInteger) nTag
               key:(NSString *) sKey {
    CWConnItem *item = [CWConnItem connWithtype:cType
                                            url:sURL
                                         params:params
                                            Tag:nTag
                                            key:sKey
                                       delegate:del];
    CWConnItem *existItem = [self hasItem:item];
    if (existItem != nil) {
        if (existItem.httpReq != nil) {
            [existItem.httpReq clearDelegatesAndCancel];
        }
        [self.connItems removeObjectForKey:[NSNumber numberWithUnsignedInteger:[existItem hash]]];

        return NO;
    }
    return YES;
}

- (NSUInteger) conURL:(NSString *) sURL
          connectType:(connectType) cType
               params:(NSDictionary *) params
               result:(void(^)(BOOL bSuccess,id returnData,NSError *error)) block {
    CWConnItem *item = [[CWConnItem alloc] initWithtype:cType
                                                    url:sURL
                                                 params:params
                                                    Tag:0
                                                    key:nil
                                  blockWithOutTagAndKey:block
                                        blockWithOutKey:nil
                                                  block:nil];
    NSUInteger hashValue = [item hash];
    [self.connItems setObject:item forKey:[NSNumber numberWithUnsignedInteger:hashValue]];
    [item release];
    
    return hashValue;
}

- (NSUInteger) conURL:(NSString *) sURL
          connectType:(connectType) cType
               params:(NSDictionary *) params
                  tag:(NSInteger) nTag
               result:(void(^)(BOOL bSuccess,id returnData,NSError *error,NSInteger nTag)) block {
    CWConnItem *item = [[CWConnItem alloc] initWithtype:cType
                                                    url:sURL
                                                 params:params
                                                    Tag:nTag
                                                    key:nil
                                  blockWithOutTagAndKey:nil
                                        blockWithOutKey:block
                                                  block:nil];
    NSUInteger hashValue = [item hash];
    [self.connItems setObject:item forKey:[NSNumber numberWithUnsignedInteger:hashValue]];
    [item release];
    
    return hashValue;
}
- (NSUInteger) conURL:(NSString *) sURL
          connectType:(connectType) cType
               params:(NSDictionary *) params
                  tag:(NSInteger) nTag
                  key:(NSString *) sKey
               result:(void(^)(BOOL bSuccess,id returnData,NSError *error,NSInteger nTag, NSString *skey)) block {
    
    CWConnItem *item = [[CWConnItem alloc] initWithtype:cType
                                                    url:sURL
                                                 params:params
                                                    Tag:nTag
                                                    key:sKey
                                  blockWithOutTagAndKey:nil
                                        blockWithOutKey:nil
                                                  block:block];
    NSUInteger hashValue = [item hash];
    [self.connItems setObject:item forKey:[NSNumber numberWithUnsignedInteger:hashValue]];
    [item release];
    
    return hashValue;
}

#pragma mark - private action
- (id) hasItem:(CWConnItem *) conn {
    NSUInteger hashValue = [conn hash];
    id object = [self.connItems objectForKey:[NSNumber numberWithUnsignedInteger:hashValue]];
    if (object == nil) {
        for(id item in [self.connItems allValues]) {
            if ([conn isEqual:item]) {
                return item;
            }
        }
    } else {
        return conn;
    }
    return nil;
}

- (void) removeItems:(CWConnItem *) conn {
    NSUInteger hashValue = [conn hash];
    id object = [self.connItems objectForKey:[NSNumber numberWithUnsignedInteger:hashValue]];
    if (object != nil) {
        [[(CWConnItem *)object httpReq] clearDelegatesAndCancel];
        [self.connItems removeObjectForKey:[NSNumber numberWithUnsignedInteger:hashValue]];
    }
}

- (void) didFinishedWithItems:(CWConnItem *) conn
                        error:(NSError *) error {
    if (error == nil) {
        if (conn.delegate && [conn.delegate respondsToSelector:@selector(didCWFinishSuccessedWithData:tag:key:)]) {
            [conn.delegate didCWFinishSuccessedWithData:conn.httpReq.responseString
                                                    tag:conn.nTag
                                                    key:conn.sKey];
        }
    } else {
        if (conn.delegate && [conn.delegate respondsToSelector:@selector(didCWFinishFailedWithError:tag:key:)]) {
            [conn.delegate didCWFinishFailedWithError:error
                                                  tag:conn.nTag
                                                  key:conn.sKey];
        }
    }
    
    [self removeItems:conn];
}

@end

后来看到ASIHttpRequest类库脸红。从新封装了一下

//
//  CWConnQueue.h
//  ASIMultiQueue
//
//  Created by  王 岩 on 13-1-17.
//  Copyright (c) 2013年  王 岩. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ASINetworkQueue.h"


//typedef enum
//{
//    connectType_GET = 0,
//    connectType_POST
//    
//} connectType;


typedef enum
{
    recvDataType_Default = 0,
    recvDataType_Data,
    recvDataType_String,
    recvDataType_JSON,
    recvDataType_XML                //暂不支持
} recvDataType;

//typedef void (^cwCompletionBlock) (BOOL bSuccess, id returnData, NSError *error);
typedef void (^cwCompletionBlockWithTag) (BOOL bSuccess, id returnData, NSError *error, NSInteger nTag);
typedef void (^cwCompletionBlockWithTagAndKey) (BOOL bSuccess, id returnData, NSError *error, NSInteger nTag, NSString *sKey);



@interface CWConnQueue : NSObject

+ (id) sharedInstance;
+ (void) releaseInstance;

#if NS_BLOCKS_AVAILABLE

- (void) connURL:(NSString *) sURL
            type:(connectType) cType
          params:(NSDictionary *) pDict
        progress:(id) progress
        recvType:(recvDataType) rType
      completion:(cwCompletionBlock) block;

- (void) connURL:(NSString *) sURL
            type:(connectType) cType
          params:(NSDictionary *) pDict
        progress:(id) progress
             tag:(NSInteger) nTag
        recvType:(recvDataType) rType
      completion:(cwCompletionBlockWithTag) block;

- (void) connURL:(NSString *) sURL
            type:(connectType) cType
          params:(NSDictionary *) pDict
        progress:(id) progress
             tag:(NSInteger) nTag
             key:(NSString *) sKey
        recvType:(recvDataType) rType
      completion:(cwCompletionBlockWithTagAndKey) block;

#endif

@end

//
//  CWConnQueue.m
//  ASIMultiQueue
//
//  Created by  王 岩 on 13-1-17.
//  Copyright (c) 2013年  王 岩. All rights reserved.
//

#import "CWConnQueue.h"
#import "ASIHTTPRequest.h"
#import "ASIFormDataRequest.h"
#import <Foundation/NSPointerArray.h>
#import <Foundation/NSJSONSerialization.h>

static CWConnQueue  *_pConnQueue_   = nil;

@interface CWConnQueue()

- (void) queueDidFinish:(ASINetworkQueue *) sender;

- (ASIHTTPRequest *) getHTTPReqWithURL:(NSURL *) url
                              progress:(id) prog
                                  type:(connectType) cType
                                 param:(NSDictionary *) pDict;

- (id) getHTTPReqRecvData:(ASIHTTPRequest *) req
                     type:(recvDataType) rType
                    error:(NSError **) error;

@end

@implementation CWConnQueue
{
@private
    ASINetworkQueue *_queue_;
}

+ (id) sharedInstance
{
    if (_pConnQueue_ == nil)
    {
        _pConnQueue_ = [[CWConnQueue alloc] init];
    }
    
    return _pConnQueue_;
}
+ (void) releaseInstance
{
    if (_pConnQueue_ != nil)
    {
        [_pConnQueue_ release];
        _pConnQueue_ = nil;
    }
}

- (id) init
{
    if (self = [super init])
    {
        _queue_ = [[ASINetworkQueue queue] retain];
        
        [_queue_ setDelegate:self];
        [_queue_ setQueueDidFinishSelector:@selector(queueDidFinish:)];
    }
    return self;
}

- (void) dealloc
{
    [_queue_ cancelAllOperations];
    [_queue_ release];
    
    [super dealloc];
}

- (void) connURL:(NSString *) sURL
            type:(connectType) cType
          params:(NSDictionary *) pDict
        progress:(id) progress
        recvType:(recvDataType) rType
      completion:(cwCompletionBlock) block
{
    NSURL *url = [NSURL URLWithString:[sURL stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
    NSAssert1(url != nil, @"url error at : %s", __FUNCTION__);
    
    ASIHTTPRequest *req = [self getHTTPReqWithURL:url
                                         progress:progress
                                             type:cType
                                            param:pDict];
    
    [req setCompletionBlock:^
    {
        NSError *error = nil;
        id rData = [self getHTTPReqRecvData:req
                                       type:rType
                                      error:&error];
        if (error == nil)
        {
            block (YES, rData, nil);
        }
        else
        {
            block (NO, nil, error);
        }
    }];
    
    if (progress)
    {
        [req setDownloadProgressDelegate:progress];
    }
    
    [req setFailedBlock:^
     {
         block(NO, nil, req.error);
     }];
    
    [_queue_ addOperation:req];
    [_queue_ go];
}

- (void) connURL:(NSString *) sURL
            type:(connectType) cType
          params:(NSDictionary *) pDict
        progress:(id) progress
             tag:(NSInteger) nTag
        recvType:(recvDataType) rType
      completion:(cwCompletionBlockWithTag) block
{
    NSURL *url = [NSURL URLWithString:[sURL stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
    
    NSAssert1(url != nil, @"url error at : %s", __FUNCTION__);
    
    ASIHTTPRequest *req = [self getHTTPReqWithURL:url
                                         progress:progress
                                             type:cType
                                            param:pDict];
    
    [req setCompletionBlock:^
     {
         NSError *error = nil;
         id rData = [self getHTTPReqRecvData:req
                                        type:rType
                                       error:&error];
         if (error == nil)
         {
             block(YES, rData, nil, nTag);
         }
         else
         {
             block (NO, nil, error, nTag);
         }
     }];
    
    if (progress)
    {
        [req setDownloadProgressDelegate:progress];
    }
    
    [req setFailedBlock:^
     {
         block(NO, nil, req.error, nTag);
     }];
    
    [_queue_ addOperation:req];
    [_queue_ go];
}

- (void) connURL:(NSString *) sURL
            type:(connectType) cType
          params:(NSDictionary *) pDict
        progress:(id) progress
             tag:(NSInteger) nTag
             key:(NSString *) sKey
        recvType:(recvDataType) rType
      completion:(cwCompletionBlockWithTagAndKey) block
{
    NSURL *url = [NSURL URLWithString:[sURL stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
    NSAssert1(url != nil, @"url error at : %s", __FUNCTION__);
    
    ASIHTTPRequest *req = [self getHTTPReqWithURL:url
                                         progress:progress
                                             type:cType
                                            param:pDict];
    
    [req setCompletionBlock:^
     {
         NSError *error = nil;
         id rData = [self getHTTPReqRecvData:req
                                        type:rType
                                       error:&error];
         if (error == nil)
         {
             block(YES, rData, nil, nTag, sKey);
         }
         else
         {
             block(NO, nil, error, nTag, sKey);
         }
     }];
    
    [req setFailedBlock:^
     {
         block(NO, nil, req.error, nTag, sKey);
     }];
    
    [_queue_ addOperation:req];
    [_queue_ go];
}

#pragma mark - private methods

- (void) queueDidFinish:(ASINetworkQueue *)sender
{

}

- (ASIHTTPRequest *) getHTTPReqWithURL:(NSURL *) url
                              progress:(id) prog
                                  type:(connectType) cType
                                 param:(NSDictionary *) pDict
{
    ASIHTTPRequest *req = nil;
    
    if (cType == connectType_GET)
    {
        req = [ASIHTTPRequest requestWithURL:url];
        [req setRequestMethod:@"GET"];
    }
    else if (cType == connectType_POST)
    {
        req = [ASIFormDataRequest requestWithURL:url];
        [req setRequestMethod:@"POST"];
        ASIFormDataRequest *form = (ASIFormDataRequest *) req;
        
        for (NSString *paramKey in [pDict allKeys])
        {
            id paramValue = [pDict objectForKey:paramKey];
            if ([paramValue isKindOfClass:[NSString class]])
            {
                [form addPostValue:paramValue forKey:paramKey];
            }
            else if ([paramValue isKindOfClass:[NSNumber class]])
            {
                [form addPostValue:[paramValue stringValue] forKey:paramKey];
            }
        }
    }
    
    if (prog)
    {
        [req setDownloadProgressDelegate:prog];
    }
    
    
    return req;
}

- (id) getHTTPReqRecvData:(ASIHTTPRequest *) req
                     type:(recvDataType) rType
                    error:(NSError **) error
{
    if (req.error != nil)
    {
        *error = req.error;
        
        return nil;
    }
    
    if (rType == recvDataType_Default ||
        rType == recvDataType_String)
    {
        *error = nil;
        return req.responseString;
    }
    else if (rType == recvDataType_Data)
    {
        *error = nil;
        return req.responseData;
    }
    else if (rType == recvDataType_JSON)
    {
        NSError *jerr = nil;
        id jsonData = [NSJSONSerialization JSONObjectWithData:req.responseData
                                                      options:NSJSONReadingMutableContainers
                                                        error:&jerr];
        
        if (jerr != nil)
        {
            *error = jerr;
            return jsonData;
        }
        else
        {
            *error = nil;
            return jsonData;
        }
        
    }
    else if (rType == recvDataType_XML)
    {
#warning 以后增加上 xml支持
        NSAssert(rType == recvDataType_Data, @"sorry, we will support XML soon");
    }
    
    *error = nil;
    return nil;
}

@end


你可能感兴趣的:(发2个基于ASIHttpRequest的多任务异步网络传输类)