iOS 的块操作也可以象Java匿名类一样到处都是
太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)
本文遵循“署名-非商业用途-保持一致”创作公用协议
整理一份之前对 ASIHTTPRequest 的分类封装
今天有点累,突然想到,先留个坑,明天用足足的代码来填满这个坑 ,后续会把以前工作中做的总结,陆续回忆并记录到这里。
预告:
NSData+ASIHTTPRequest
NSDictionary+ASIHTTPRequest
NSObject+ASIHTTPRequest
NSString+ASIHTTPRequest
下面开始填坑,以下仅对 NSObject的分类给予相关代码说明,其它的可以从这个扩展,就自个弄吧。
类声明文件:
//NSObject+ASIHTTPRequest.h
#import <Foundation/Foundation.h>
#import "ASIFormDataRequest.h"
@interface NSObject (ASIHTTPRequest)
- (void)postUrlPath:(NSString *)urlPath body:(id)body success:(void (^)(ASIFormDataRequest *request))success fail:(void (^)(ASIFormDataRequest *request))fail;
- (void)getUrlPath:(NSString *)urlPath param:(id)param success:(void (^)(ASIFormDataRequest *request))success fail:(void (^)(ASIFormDataRequest *request))fail;
- (void)requestUrlPath:(NSString *)urlPath method:(NSString *)method body:(id)body success:(void (^)(ASIFormDataRequest *request))success fail:(void (^)(ASIFormDataRequest *request))fail;
@end
类实现文件:
// NSObject+ASIHTTPRequest.m
#import "NSObject+ASIHTTPRequest.h"
@implementation NSObject (ASIHTTPRequest)
- (void)postUrlPath:(NSString *)urlPath body:(id)body success:(void (^)(ASIFormDataRequest *request))success fail:(void (^)(ASIFormDataRequest *request))fail {
[self requestUrlPath:urlPath method:@"POST" body:body success:success fail:fail];
}
- (void)getUrlPath:(NSString *)urlPath param:(id)param success:(void (^)(ASIFormDataRequest *request))success fail:(void (^)(ASIFormDataRequest *request))fail {
[self requestUrlPath:urlPath method:@"GET" body:param success:success fail:fail];
}
- (void)requestUrlPath:(NSString *)urlPath method:(NSString *)method body:(id)body success:(void (^)(ASIFormDataRequest *request))success fail:(void (^)(ASIFormDataRequest *request))fail {
NSURL *url = [NSURL URLWithString:urlPath];
__block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
__weak ASIFormDataRequest *blockRequest = request;
[request setShouldContinueWhenAppEntersBackground:YES];
[request setPostValue:[UIDevice currentDevice].model forKey:@"clienttype"];
[request setRequestMethod:method];
// 如果是 GET 或 POST 方法,并且协议体不为空,则添加参数(以下更适用于 ASIHTTPRequest)
if (nil != body) {
if ([@"POST" isEqualToString:method]) {
if ([body isKindOfClass:[NSDictionary class]]) {
NSDictionary *bodyDic = (NSDictionary *)body;
for (NSString *key in bodyDic.allKeys) {
id object =[bodyDic objectForKey:key];
[request setPostValue:object forKey:key];
}
}
else if ([body isKindOfClass:[NSString class]] || [body isKindOfClass:[NSData class]]) {
NSData *tempData = nil;
if ([body isKindOfClass:[NSString class]]) {
tempData = [body dataUsingEncoding:NSUTF8StringEncoding];
}
else {
tempData = body;
}
[request setPostBody:[NSMutableData dataWithData:tempData]];
[request setPostLength:[tempData length]];
}
}
else if ([@"GET" isEqualToString:method]) {
// 增加 GET 参数
if ([body isKindOfClass:[NSDictionary class]]) {
NSDictionary *bodyDic = (NSDictionary *)body;
NSMutableString *paramStr = [[NSMutableString alloc] init];
for (NSString *key in bodyDic.allKeys) {
id object =[bodyDic objectForKey:key];
[paramStr appendFormat:@"%@=%@&", key, object];
}
NSString *urlWithParam = [urlPath stringByAppendingFormat:@"?%@", paramStr];
NSLog(@"urlWithParam = %@", urlWithParam);
request.url = [NSURL URLWithString:urlWithParam];
}
else if ([body isKindOfClass:[NSString class]] || [body isKindOfClass:[NSData class]]) {
NSString *paramStr = nil;
if ([body isKindOfClass:[NSString class]]) {
paramStr = (NSString *)body;
}
else {
paramStr = [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding];
}
NSString *urlWithParam = [urlPath stringByAppendingFormat:@"?%@", paramStr];
NSLog(@"urlWithParam = %@", urlWithParam);
request.url = [NSURL URLWithString:urlWithParam];
}
// 清空 POST 包体
[request setPostBody:nil];
[request setPostLength:0];
}
else {
}
}
[request setCompletionBlock:^{
success(blockRequest);
}];
[request setFailedBlock:^{
fail(blockRequest);
}];
[request startAsynchronous];
}
@end