ASIFormDataRequest进行网络请求,包括上传,下载。使用代码块模式,用户可自定义请求模式,即GET,或POST。同时可根据请求参数中是否包含文件,而进行文件的上传处理。
.h文件
#import <Foundation/Foundation.h>
#import "ASIFormDataRequest.h"
#import "JSON.h"
/****************************************************************/
// 文件信息
@interface FileModal : NSObject
@property (nonatomic, strong) NSString *fileName; // 文件名称
@property (nonatomic, strong) NSString *filePath; // 文件路径
/****************************************************************/
static NSString *const requestType_get = @"GET";
static NSString *const requestType_post = @"POST";
@interface NetRequestBlockManager : NSObject
/// 单例
+ (NetRequestBlockManager *)shareRequest;
/// 发送请求(开始,成功,失败)
- (ASIFormDataRequest *)sendRequest:(NSString *)urlString
parameter:(NSDictionary *)parameter
didStart:(void (^)(void))startBlock
didFinished:(void (^)(id obj))finishedBlock
didFailed:(void (^)(NSError *error))failedBlock
finally:(void (^)(void))finallyBlock;
/// 发送请求,自定义请求方式
- (ASIFormDataRequest *)sendRequest:(NSString *)urlString
parameter:(NSDictionary *)parameter
requestType:(NSString *)type
didStart:(void (^)(void))startBlock
didFinished:(void (^)(id obj))finishedBlock
didFailed:(void (^)(NSError *error))failedBlock
finally:(void (^)(void))finallyBlock;
@end
.m文件
#import "NetRequestBlockManager.h"
static NetRequestBlockManager *staticRequestManager;
/****************************************************************/
// 文件信息
@implementation FileModal
@synthesize fileName;
@synthesize filePath;
@end
/****************************************************************/
@implementation NetRequestBlockManager
- (id)init
{
self = [super init];
if (self)
{
}
return self;
}
+ (NetRequestBlockManager *)shareRequest
{
if (staticRequestManager == nil)
{
staticRequestManager = [[NetRequestBlockManager alloc] init];
}
return staticRequestManager;
}
/// 发送请求
- (ASIFormDataRequest *)sendRequest:(NSString *)urlString
parameter:(NSDictionary *)parameter
didStart:(void (^)(void))startBlock
didFinished:(void (^)(id obj))finishedBlock
didFailed:(void (^)(NSError *error))failedBlock
finally:(void (^)(void))finallyBlock
{
// 创建请求 __block 在非ARC下时使用,而ARC下则用__weak
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:urlString]];
// 设置请求模式,根据有无参数情况
NSString *requestMethod = (!parameter ? requestType_get : requestType_post);
request.requestMethod = requestMethod;
// 设置请求超时
request.timeOutSeconds = 30.0;
// 参数设置
for (NSString *key in parameter.allKeys)
{
id valueObj = [parameter objectForKey:key];
if ([valueObj isKindOfClass:[FileModal class]])
{
// 上传文件
FileModal *fileModal = (FileModal *)valueObj;
NSString *filePath = fileModal.filePath;
NSString *fileName = [filePath substringFromIndex:[filePath rangeOfString:@"/" options:NSBackwardsSearch].location + 1];
[request setFile:filePath withFileName:fileName andContentType:@"multipart/form-data" forKey:key];
}
else
{
[request setPostValue:valueObj forKey:key];
}
}
__weak ASIFormDataRequest *weakRequest = request;
// 设置请求开始时
[request setStartedBlock:^{
#if NS_BLOCKS_AVAILABLE
if (startBlock)
{
startBlock();
}
#endif
}];
// 设置请求成功时
[request setCompletionBlock:^{
#if NS_BLOCKS_AVAILABLE
if (finishedBlock)
{
NSString *responseString = [[NSString alloc] initWithData:[weakRequest responseData] encoding:NSUTF8StringEncoding];
finishedBlock([responseString JSONValue]);
NSLog(@"request url:%@\n request methord:%@\n requst para:%@\n result:%@", urlString, weakRequest.requestMethod, parameter, responseString);
}
if (finallyBlock)
{
finallyBlock();
}
#endif
}];
// 设置请求失败时
[request setFailedBlock:^{
#if NS_BLOCKS_AVAILABLE
if (failedBlock)
{
failedBlock([weakRequest error]);
}
if (finallyBlock)
{
finallyBlock();
}
#endif
}];
// 发送异步请求
[request startAsynchronous];
return request;
}
/// 发送请求,自定义请求方式
- (ASIFormDataRequest *)sendRequest:(NSString *)urlString
parameter:(NSDictionary *)parameter
requestType:(NSString *)type
didStart:(void (^)(void))startBlock
didFinished:(void (^)(id obj))finishedBlock
didFailed:(void (^)(NSError *error))failedBlock
finally:(void (^)(void))finallyBlock
{
// 创建请求 __block 在非ARC下时使用,而ARC下则用__weak
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:urlString]];
// 设置请求模式,根据有无参数情况
NSString *requestMethod = type;
request.requestMethod = requestMethod;
// 设置请求超时
request.timeOutSeconds = 30.0;
// 参数设置
for (NSString *key in parameter.allKeys)
{
id valueObj = [parameter objectForKey:key];
if ([valueObj isKindOfClass:[FileModal class]])
{
// 上传文件
FileModal *fileModal = (FileModal *)valueObj;
NSString *filePath = fileModal.filePath;
NSString *fileName = [filePath substringFromIndex:[filePath rangeOfString:@"/" options:NSBackwardsSearch].location + 1];
[request setFile:filePath withFileName:fileName andContentType:@"multipart/form-data" forKey:key];
}
else
{
[request setPostValue:valueObj forKey:key];
}
}
__weak ASIFormDataRequest *weakRequest = request;
// 设置请求开始时
[request setStartedBlock:^{
#if NS_BLOCKS_AVAILABLE
if (startBlock)
{
startBlock();
}
#endif
}];
// 设置请求成功时
[request setCompletionBlock:^{
#if NS_BLOCKS_AVAILABLE
if (finishedBlock)
{
NSString *responseString = [[NSString alloc] initWithData:[weakRequest responseData] encoding:NSUTF8StringEncoding];
finishedBlock([responseString JSONValue]);
NSLog(@"request url:%@\n request methord:%@\n requst para:%@\n result:%@", urlString, weakRequest.requestMethod, parameter, responseString);
}
if (finallyBlock)
{
finallyBlock();
}
#endif
}];
// 设置请求失败时
[request setFailedBlock:^{
#if NS_BLOCKS_AVAILABLE
if (failedBlock)
{
failedBlock([weakRequest error]);
}
if (finallyBlock)
{
finallyBlock();
}
#endif
}];
// 发送异步请求
[request startAsynchronous];
return request;
}
@end
使用
1 导入头文件
#import "NetRequestBlockManager.h"
2 使用
注意内存管理,即相互引用
2-1
__weak 当前类名称 weakSelf = self;
[[NetRequestBlockManager shareRequest] sendRequest:请求地址 parameter:请求参数 didStart:^{
// 开始
} didFinished:^(id obj) {
// 成功
} didFailed:^(NSError *error) {
// 失败
} finally:^{
// 结束
}];
2-2
__weak 当前类名称 weakSelf = self;
[[NetRequestBlockManager shareRequest] sendRequest:请求地址 parameter:请求参数 requestType:请求类型 didStart:^{
// 开始
} didFinished:^(id obj) {
// 成功
}
} didFailed:^(NSError *error) {
// 失败
} finally:^{
// 结束
}];
&spm=1001.2101.3001.5002&articleId=100724072&d=1&t=3&u=bf77d5853d4e4dce84ce1155fa23920f)
5138

被折叠的 条评论
为什么被折叠?



