版权声明:本文为博主原创文章,转载请注明文章出处。 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;
}