先来说一下AFNetworking从1.0到3.0的发展:
AFNetworking 1.0完全基于NSURLConnection的API;AFNetworking 2.0在基于NSURLConnection的API基础上,添加了基于NSURLSession的API选项;AFNetworking 3.0则是抛弃的NSURLConnection,完全基于NSURLSession的API.这也是基于苹果弃用NSURLConnection而不得已做出的选择.
我们在开发中会遇到许多使用AFNetworking2.X或更老的AFNetworking库,它们与最新的AFNetworking是无法兼容的.原因如下:
1.AFNetworking 3.0移除了下面三个类
AFURLConnectionOperation
AFHTTPRequestOperation
AFHTTPRequestOperationManager
2.AFNetworking 3.0修改了下面三个类
UIImageView+AFNetworking
UIWebView+AFNetworking
UIButton+AFNetworking
对以上类的移除和修改导致了AFNetworking3.0无法向上兼容.所以我们在AFNetworking3.0的环境下,就不能去使用AFNetworking3.0之前封装的网络工具类了.解决办法有两个,一个是修改网络工具类,另一个就是重写网络工具类(好吧,其实这就是一个方法).
如何使用AFNetworking3.0重写网络工具类?
1.建立会话
AFHTTPSessionManager *session =[AFHTTPSessionManager manager];
session.requestSerializer=[AFJSONRequestSerializer serializer];
NSMutableDictionary*parameters=[NSMutableDictionary dictionary];
parameters[@"start"] =@"1";
parameters[@"end"] =@"5";
2.get请求
[session GET:urlStr parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
successBlock(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
failureBlock(error);
}];
3.post请求
[session POST:urlStr parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
successBlock(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
failureBlock(error);
}];
封装一个通用的网络请求方式:
1.单例类
+ (instancetype)sharedTools {
static QLMNetworkTools *tools;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
tools = [[QLMNetworkTools alloc] initWithBaseURL:[NSURL URLWithString:@"http://www.baidu.com"]];
tools.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];
});
return tools;
}
2.通用的请求方式
- (void)requestWithType: (RequestType)requestType andUrlStr: (NSString *)urlStr andParams: (id)parameters andSuccess: (void (^)(id responseObject))successBlock andFailture: (void (^)(NSError *error))failureBlock{
if (requestType == GET) {
[self GET:urlStr parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
successBlock(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
failureBlock(error);
}];
} else {
[self POST:urlStr parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
successBlock(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
failureBlock(error);
}];
}
}