AFNetworking源码剖析

版权声明:本文为博主原创文章,转载请注明文章出处。 https://blog.csdn.net/qfeung/article/details/78270371
  • iOS和macOS强大的网络框架, 使用它, 你甚至可以不用知道什么是NSURLRequest, NSURLConnection, NSURLSession.
  • 大多数iOS开发, 都习惯了用AFN进行所有的网络请求, 但你真的知道AFN都为我们做了哪些事情吗? 为什么我们不用Apple原生的NSURLSession而选择ADNetworking?

AFN3.x的源码分析

框架结构

框架源码整个结构

除去支持文件(Support Files), AFN按照功能分为5个模块:

  • 网络通信模块(AFNSessionManager, AFNHTTPSessionManager)
  • 网络状态监听模块(Reachability)
  • 通信安全策略模块(Security)
  • 信息序列化 / 反序列化模块(Serialization)
  • 对UIKit库的扩展(UIKit)

框架的核心为网络通信模块中的AFNSessionManager.

AFN3.x是基于NSURLSession来封装的. 所以AFN的本质是围绕着NSURLSession做了一系列上层封装, 而其余四个模块, 均是为了配合AFNSessionManager类的网络通信而做一些必要的辅助处理工作. 这5个功能模块的关系如下图所示.
这里写图片描述

对外接口类: AFNHTTPSessionManager

  • 继承自AFNURLSessionManager的, 这个类提供了对外调用的接口, 我们一般做网络请求都是用这个类, 但实际上, 它本身没有做实事, 只是做了一些简单的封装, 把请求逻辑分发给父类AFNURLSessionManager去做.
  • 我们初始化AFN实例的时候, 都是使用此类的几个方法:
///---------------------
/// @name Initialization
///---------------------

/**
 Creates and returns an `AFHTTPSessionManager` object.
 创建并返回一个`AFHTTPSessionManager`实例对象.
 */
+ (instancetype)manager;

/**
 Initializes an `AFHTTPSessionManager` object with the specified base URL.
 用指定的`base URL`初始化一个`AFHTTPSessionManager`对象.

 @param url The base URL for the HTTP client.
 参数 url -> HTTP代理的`base URL`.

 @return The newly-initialized HTTP client
 返回 -> 被初始化的新`HTTP 代理`.
 */
- (instancetype)initWithBaseURL:(nullable NSURL *)url;

/**
 Initializes an `AFHTTPSessionManager` object with the specified base URL.
 用指定的`base URL`初始化一个`AFHTTPSessionManager`对象.

 This is the designated initializer.
 这是指定的`初始器`.

 @param url The base URL for the HTTP client.
 @param configuration The configuration used to create the managed session.
 参数 configuration -> 用于创建被管理网络会话的配置对象.

 @return The newly-initialized HTTP client
 */
- (instancetype)initWithBaseURL:(nullable NSURL *)url
           sessionConfiguration:(nullable NSURLSessionConfiguration *)configuration NS_DESIGNATED_INITIALIZER;
  • 发起网络请求, 都是调用该类的以下方法:
///---------------------------
/// @name Making HTTP Requests
///---------------------------

/**
 Creates and runs an `NSURLSessionDataTask` with a `GET` request.
 使用`GET`请求, 创建并运行一个`NSURLSessionDataTask`任务.
 */
- (nullable NSURLSessionDataTask *)GET:(NSString *)URLString
                   parameters:(nullable id)parameters
                      success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                      failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE;

/**
 Creates and runs an `NSURLSessionDataTask` with a `POST` request.
 使用`POST`请求, 创建并运行一个`NSURLSessionDataTask`任务.
 */
- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(nullable id)parameters
                       success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                       failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE;
// 主要用到的是以上两个, 当然还有其他几个大家可以到源码中自己研究...

我们之前说过, 此类不做实事, 只是提供对外的接口, 真正的初始化, 以及网络请求, 都是交给父类AFNURLSessionManager去做, 找到的实例如下:

初始化方法转交给父类

- (instancetype)initWithBaseURL:(NSURL *)url
           sessionConfiguration:(NSURLSessionConfiguration *)configuration
{
    self = [super initWithSessionConfiguration:configuration];
    if (!self) {
        return nil;
    }

    // Ensure terminal slash for baseURL path, so that NSURL +URLWithString:relativeToURL: works as expected
    if ([[url path] length] > 0 && ![[url absoluteString] hasSuffix:@"/"]) {
        url = [url URLByAppendingPathComponent:@""];
    }

    self.baseURL = url;

    self.requestSerializer = [AFHTTPRequestSerializer serializer];
    self.responseSerializer = [AFJSONResponseSerializer serializer];

    return self;
}

猜你喜欢

转载自blog.csdn.net/qfeung/article/details/78270371