封装 ASIHTTPRequest 多请求管理类

来源:互联网 发布:python 自定义迭代器 编辑:程序博客网 时间:2024/06/06 07:49

使用方法如上图.


下面直接发代码:

头文件

////  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


原创粉丝点击