AFNetworking(3.10)源码解析(二):网络通信模块数据请求

1.AFHTTPSessionManager的初始化

a.因为AFHTTPSessionManager是继承与AFURLSessionManager的,所以在初始化的时候,调用了父类的出事后方法,初始化了网络通信的一系列配置等。

AFNetworking(3.10)源码解析(二):网络通信模块数据请求_第1张图片

b.父类的初始化化

·初始化NSURLSessionConfiguration对象,用于配置NSURLSession

         1.一般模式(default):工作模式类似于原来的NSURLConnection,可以使用缓存的Cache,Cookie,鉴权。

         2.及时模式(ephemeral):不保存任何数据到磁盘,不使用缓存的Cache,Cookie,鉴权。

        3.后台模式(background):支持在后台完成上传下载 (需要iOS 8以上)

- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration

 if (!configuration) {

configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

}

·创建队列,并设置最大并发数为1。

self.operationQueue = [[NSOperationQueue alloc] init];

self.operationQueue.maxConcurrentOperationCount = 1;

·初始化NSURLSession对象、化响应序列、网络安全策略、网络监控

self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];

self.responseSerializer = [AFJSONResponseSerializer serializer];

self.securityPolicy = [AFSecurityPolicy defaultPolicy];

self.reachabilityManager = [AFNetworkReachabilityManager sharedManager];

·初始化存储请求管理对像的字典、锁对象

self.mutableTaskDelegatesKeyedByTaskIdentifier = [[NSMutableDictionary alloc] init];

self.lock = [[NSLock alloc] init];

self.lock.name = AFURLSessionManagerLockName;

·获取NSURLSession所有的网络任务,并执行回调处理

[self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {

for (NSURLSessionDataTask *task in dataTasks) {

[self addDelegateForDataTask:task uploadProgress:nil downloadProgress:nil completionHandler:nil];

}

for (NSURLSessionUploadTask *uploadTask in uploadTasks) {

[self addDelegateForUploadTask:uploadTask progress:nil completionHandler:nil];

}

for (NSURLSessionDownloadTask *downloadTask in downloadTasks) {

[self addDelegateForDownloadTask:downloadTask progress:nil destination:nil completionHandler:nil];

}

}];

2.发起网络请求,这里已GET请求为例子

·创建和开始任务

- (NSURLSessionDataTask *)GET:(NSString *)URLString

parameters:(id)parameters

progress:(void (^)(NSProgress * _Nonnull))downloadProgress

success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success

failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure

·创建NSMutableURLRequest

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;

}

·数据的回调

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);

}

}

}];

3.接着在AFURLSessionManager主要实现了对网络数据的处理,通过回调传递数据,暴露公开接口

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request

uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgressBlock

downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgressBlock

completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject,  NSError * _Nullable error))completionHandler

在此接口里url_session_manager_create_task_safely的方法,是为了解决iOS8以下如果并发创建NSURLSessionTask时会出现的bug(源码里有对应的链接)。

·再来看方法:

- (void)addDelegateForDataTask:(NSURLSessionDataTask *)dataTask

uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgressBlock

downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgressBlock

completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler

这里主要是创建task的管理对象,并存储task的管理对象到self.mutableTaskDelegatesKeyedByTaskIdentifier这个字典里。主要目的是为了在上传和下载的时候,通过这个字典可以拿到当前请求的task管理对象,进而处理续传、挂起等操作。

3.网络数据的回调

·在管理类AFURLSessionManager里遵循了NSURLSession的一系列代理,以及实现了这些代理的方法。

通过task的taskIdentifier属性,在self.mutableTaskDelegatesKeyedByTaskIdentifier这个字典里找到像对应的管路对象,并在此对象里处理数据。然后回调。

至此就完成了网络通信模块基本数据的请求

你可能感兴趣的:(AFNetworking(3.10)源码解析(二):网络通信模块数据请求)