使用方法如上图.
下面直接发代码:
头文件
//
// 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