封装 ASIHTTPRequest 多请求管理类

使用方法如上图.


下面直接发代码:

头文件

//
//  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]) {
                [form addPostValue:[params objectForKey:paramKey] forKey:paramKey];
            }
        }

        [httpReq setCompletionBlock:^(void){
            //如果没有tag和key
            if (blockWithOutTagAndKey) {
                blockWithOutTagAndKey(YES, httpReq.responseString, nil);
            }
            //如果没有key
            if (blockWithOutKey) {
                blockWithOutKey(YES, httpReq.responseString, nil, nTag);
            }
            
            if (block) {
                block(YES, httpReq.responseString, nil, self.nTag, self.sKey);
            }
            
            if([[CWLWConnectManager sharedInstance] respondsToSelector:@selector(didFinishedWithItems:error:)]) {
                [[CWLWConnectManager sharedInstance] performSelector:@selector(didFinishedWithItems:error:)
                                                          withObject:self
                                                          withObject:nil];
            }
        }];

        [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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值