iOS第三方库

AFNetworking 3.x 阅读笔记(二)

2016-09-17  本文已影响55人  brownfeng

AFNetworking网络库结构

AFNetworking网络库的重要类如下图:

网络库总体类结构.png

AFURLSessionManager是核心类,对外接口包装类使用的AFHTTPSessionManager.作者建议我们对AFHTTPSessionManager进行封装成我们自己使用的类.整个框架包括安全相关,网络状态监听,响应序列化,以及请求序列化. 其中通过数字标注大概的调用栈的走向.

AFHTTPSessonManager的GET/POST

下图是常用的GET/POST方法的封装.

AFHTTPSessonManager对外接口方法.png

下图是使用AFHTTPSessionManager的dataTask相关的接口调用栈,与重要解释.

dataTask接口调用栈.png

从图中可以看出,所有的接口方法都会调用到如下方法:

- (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生成,包括四大块:

同时,使用AFQueryStringPair辅助格式化参数,其中比较重要的是递归将NSDictionary --> 特殊格式的NSString

AFHTTPSessonManager的 mutilpart POST

版面 4.png

可以看出multipart Post和普通数据post多了使用AFStreamingMultipartFormData构造HTTP Body的过程.具体的解释可以参考前面的文章.

上一篇下一篇

猜你喜欢

热点阅读