AFNetworking 源码阅读

2020-02-12  本文已影响0人  Tony17
AFNetworking.png

前言

AFNetworking 是 Objective-C 语言编写的一套简单易用的网络请求库,本库让开发者不需要编写繁琐的网络框架代码就可以完成一次网络请求。AFNetworking 默认提供GETPOSTPUTHEADPATCHDELETE这几种请求方式。简单调用如下:

[[AFHTTPSessionManager manager] GET:@"request url" parameters:@{@"key1":@"value1"} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"success");
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"failed");
    }];

今天我们就来看下 AFNetworking 内部是如何实现的。

实现步骤

简单的流程图如下:


AFNetworking调用流程.png

下面我们详细看一下每个步骤的具体实现是怎样的:

初始化Manager

在这个步骤中主要是初始化各种设置,例如

创建 Request

通过 RequestSerializer 类来创建Request,其中主要是设置header信息和根据不同的请求方式对参数做不同的处理。

创建 DataTask

在这个步骤中,只要调用系统的dataTaskWithRequest方法来创建Task,并设置Task的代理方法。

调用Resume

由于是异步请求,所以在创建完Task之后,直接调用Resume方法。

处理请求结果

等待请求完成方法回调 URLSession: task:didCompleteWithError:,回调这个方法的时候,说明请求已经结束了。所以在这个方法里面做返回信息的处理。除了添加一些公共辅助信息之外,最主要的是解析返回信息的JSON串。根据返回是否有错误来决定是否解析返回信息

调用相应的Block返回

上一步组装完具体返回信息之后,根据是否自定义了 completionGroup 和 completionQueue 来确定 dispatch_async 的参数并调用Block返回。同时需要发送请求完成的通知。

在以上的步骤中,任何一步出现 Error 都会中断请求并直接返回错误信息。

补充

RequestSerializer

用来生成 Request类,主要封装了超时时间,header设置,缓存策略,编码等信息。

ResponseSerializer

用来解析接口返回信息,例如JSON串或者图片信息等。其中定义了可解析的内容格式为application/xmltext/xml。由于 AFNetworking 的定位问题,所以这里没有对其他内容格式做兼容并且没有提供自定义的入口,如果需要兼容其他格式(例如text/html等),就需要使用者自己到这个地方修改。

securityPolicy

如果本地需要验证证书,需要在初始化的时候做证书设置,主要是指定验证的模式

在URLSession的回调方法URLSession:didReceiveChallenge:completionHandler:中验证证书是否有效。

最后

AFNetworking 是一个非常优秀的网络请求库,为我们减少了很多工作量,我们不需要做很多学习就可以使用。但是由于定位原因,所以该库并没有把许多设置开放出来(例如自定义返回格式等)。

欢迎斧正。

上一篇 下一篇

猜你喜欢

热点阅读