对于使用 AFNetworking
的朋友来说,很多朋友都是直接调用 AFNetworking
的 API
,这样不太好,无法做到全工程统一配置。
最好的方式就是对网络层再封装一层,全工程不允许直接使用 AFNetworking
的 API
,必须调用我们自己封装的一层,如此一来,任何网络配置都可以在这一层里配置好,使用的人无须知道里面在干嘛,只管调用就可以了。
本篇为基于AFNetworking3.0的版本,支持iOS7及其以上版本。
基于NSObject的类创建一个继承于NSObject类的命名为(个人命名)NetManager的类。
在.h文件中
#import "AFNetworking.h"
typedef void(^DownLoadFinishedBlock)(id responseObj);
typedef void (^DownLoadFialedBlock)(NSError*error);
@interface NetManager : NSObject
GET请求数据的方法
+(void)doGetWithUrlStr:(NSString*)urlString parameters:(NSDictionary*)dic contentType:(NSString*)type finished:(DownLoadFinishedBlock)finished failure:(DownLoadFialedBlock)fialed;
POST请求数据的方法
+(void)doPostWithUrlStr:(NSString*)urlString parameters:(NSDictionary*)dic contentType:(NSString*)type finished:(DownLoadFinishedBlock)finished failure:(DownLoadFialedBlock)fialed;
@end
DownLoadFinishedBlock 是响应成功的回调,返回的是id类型,外部再转换成类型模型就可以了。
DownLoadFialedBlock 是响应失败的回调,只有一个 NSError
对象,外部可接收处理。
在.m文件中
GET请求的处理:
+(void)doGetWithUrlStr:(NSString*)urlString parameters:(NSDictionary*)dic contentType:(NSString*)type finished:(DownLoadFinishedBlock)finished failure:(DownLoadFialedBlock)fialed{
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:type, nil];
[manager GET:urlString parameters:dic progress:^(NSProgress * _Nonnull downloadProgress) {
// 这里可以获取到目前的数据请求的进度
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 请求成功,解析数据
finished(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// 请求失败
fialed(error);
}];
}
POST请求的处理:
+(void)doPostWithUrlStr:(NSString*)urlString parameters:(NSDictionary*)dic contentType:(NSString*)type finished:(DownLoadFinishedBlock)finished failure:(DownLoadFialedBlock)fialed
{
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:type, nil];
[manager POST:urlString parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
// 拼接data到请求体,这个block的参数是遵守AFMultipartFormData协议的。
} progress:^(NSProgress * _Nonnull uploadProgress) {
// 这里可以获取到目前的数据请求的进度
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 请求成功,解析数据
finished(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// 请求失败
fialed(error);
}];
}
下面是在一个例子,就是在自己的项目中,调用自己封装好的类;
假如点击按钮时下载数据
在该控制器类中,调用之前封装的方法即可。
#import "NetManager.h"
在按钮点击事件里执行下方方法即可:
-(void)btnClicked:(UIButton *)btn{
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setValue:@"1" forKey:@"type"];
[dict setValue:@"1" forKey:@"placed"];
[NetManager doGetWithUrlStr:@"http://app.youmyou.com/index.aspx?" parameters:dict contentType:@"text/html" finished:^(id responseObj) {
//对responseObj做对应的操作即可
//eg:
id json = [NSJSONSerialization JSONObjectWithData:responseObj options:NSJSONReadingMutableContainers error:nil];
NSLog(@"json = %@",json);
} failure:^(NSError *error) {
NSLog(@"%@",error.description);
}];
}