美文网首页iOS第三方库
AFNetworking 3.x 阅读笔记(二)

AFNetworking 3.x 阅读笔记(二)

作者: brownfeng | 来源:发表于2016-09-17 23:44 被阅读55次

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

    • 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的过程.具体的解释可以参考前面的文章.

    相关文章

      网友评论

        本文标题:AFNetworking 3.x 阅读笔记(二)

        本文链接:https://www.haomeiwen.com/subject/wrovettx.html