AFNetworking 3.x 阅读笔记(二)
2016-09-17 本文已影响55人
brownfeng
AFNetworking网络库结构
AFNetworking网络库的重要类如下图:
网络库总体类结构.pngAFURLSessionManager
是核心类,对外接口包装类使用的AFHTTPSessionManager
.作者建议我们对AFHTTPSessionManager
进行封装成我们自己使用的类.整个框架包括安全相关,网络状态监听,响应序列化,以及请求序列化. 其中通过数字标注大概的调用栈的走向.
AFHTTPSessonManager的GET/POST
下图是常用的GET/POST方法的封装.
AFHTTPSessonManager对外接口方法.png下图是使用AFHTTPSessionManager
的dataTask相关的接口调用栈,与重要解释.
从图中可以看出,所有的接口方法都会调用到如下方法:
- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method
URLString:(NSString *)URLString
parameters:(id)parameters
uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress
downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgress
success:(void (^)(NSURLSessionDataTask *, id))success
failure:(void (^)(NSURLSessionDataTask *, NSError *))failure
{
NSError *serializationError = nil;
NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];
if (serializationError) {
if (failure) {
dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{
failure(nil, serializationError);
});
}
return nil;
}
__block NSURLSessionDataTask *dataTask = nil;
dataTask = [self dataTaskWithRequest:request
uploadProgress:uploadProgress
downloadProgress:downloadProgress
completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
if (error) {
if (failure) {
failure(dataTask, error);
}
} else {
if (success) {
success(dataTask, responseObject);
}
}
}];
return dataTask;
}
AFHTTPRequestSerializer
实际是一个NSURLRequest
的helper类,主要用于辅助NSURLRequest
生成,包括四大块:
- HTTP method以及相应的参数格式化,请求URL等
- HTTP Headers: 包括UA, language等
- HTTPBody(POST请求或者 mutilpart Post上传文件)
- NSURLRequest的其他属性,例如timeout等
同时,使用
AFQueryStringPair
辅助格式化参数,其中比较重要的是递归将NSDictionary --> 特殊格式的NSString
AFHTTPSessonManager的 mutilpart POST
版面 4.png可以看出multipart Post和普通数据post多了使用AFStreamingMultipartFormData
构造HTTP Body的过程.具体的解释可以参考前面的文章.