一旦AFN有較大的變動(dòng),用到AFN的項(xiàng)目需要更改很多的地方,為了避免這種情況,一般會(huì)對(duì)AFN封裝出一個(gè)類忆植,這樣有了變動(dòng)之后,只需要更改這個(gè)類即可(代碼如下)
.h文件
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger, RequestMethod)
{
post,
get
};
@interface NetworkTools : NSObject
+ (instancetype)shareNetworkTools;
/**
* requestMethod:請(qǐng)求方式
* urlString:請(qǐng)求地址
* parameters:請(qǐng)求參數(shù)
* responseBlock:請(qǐng)求成功或失敗的回調(diào)
*/
- (void)requestWithMethod:(RequestMethod)requestMethod andUrlString:(NSString *)urlString andParameters:(id) parameters andFinished:(void(^)(id response, NSError *error))responseBlock;
/**
* data:上傳資料
* name:上傳資料的名字
* urlString:請(qǐng)求地址
* parameters:請(qǐng)求參數(shù)
* responseBlock:請(qǐng)求成功或失敗的回調(diào)
*/
- (void)requestWithData:(NSData *)data andName:(NSString *)name andUrlString:(NSString *)urlString andParameters:(id) parameters andFinished:(void(^)(id response, NSError *error))responseBlock;
@end
.m文件
#import "NetworkTools.h"
#import <AFNetworking.h>
@implementation NetworkTools
+ (instancetype)shareNetworkTools
{
static NetworkTools *networkTools = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
networkTools = [[NetworkTools alloc] init];
});
return networkTools;
}
- (void)requestWithMethod:(RequestMethod)requestMethod andUrlString:(NSString *)urlString andParameters:(id) parameters andFinished:(void(^)(id response, NSError *error))responseBlock
{
// 定義成功的block
void (^success)(NSURLSessionDataTask *dataTask, id responseObject) = ^(NSURLSessionDataTask *dataTask,id responseObject)
{
responseBlock(responseObject, nil);
};
// 定義失敗的block
void (^failure)(NSURLSessionDataTask *dataTask,NSError *error) = ^(NSURLSessionDataTask *dataTask,NSError *error)
{
responseBlock(nil, error);
};
if (requestMethod == get) {
[[AFHTTPSessionManager manager] GET:urlString parameters:parameters success:success failure:failure];
} else {
[[AFHTTPSessionManager manager] POST:urlString parameters:parameters success:success failure:failure];
}
}
- (void)requestWithData:(NSData *)data andName:(NSString *)name andUrlString:(NSString *)urlString andParameters:(id) parameters andFinished:(void(^)(id response, NSError *error))responseBlock
{
void (^success)(NSURLSessionDataTask *dataTask, id responseObject) = ^(NSURLSessionDataTask *dataTask,id responseObject)
{
responseBlock(responseObject, nil);
};
void (^failure)(NSURLSessionDataTask *dataTask,NSError *error) = ^(NSURLSessionDataTask *dataTask,NSError *error)
{
responseBlock(nil, error);
};
[[AFHTTPSessionManager manager] POST:urlString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
[formData appendPartWithFileData:data name:name fileName:@"aa" mimeType:@"application/octet-stream"];
} success:success failure:failure];
}
@end
AFN與其它框架對(duì)比
AFNetWorking:簡(jiǎn)單易用,提供了基本夠用的常用功能,有人更新和維護(hù)谒臼,而且目前使用者很多 朝刊。其相關(guān)資料,文檔蜈缤,demo很多拾氓,很好找遇到問(wèn)題好解決。
ASIHttpRequest: ASI的底層基于純C語(yǔ)言的CFNetwork框架,功能很強(qiáng)大,可惜作者已停止更新.
MKNetWorkKit:簡(jiǎn)單易用,維護(hù)和使用者少.