1.AFHTTPSessionManager的初始化
a.因为AFHTTPSessionManager是继承与AFURLSessionManager的,所以在初始化的时候,调用了父类的出事后方法,初始化了网络通信的一系列配置等。
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这个字典里找到像对应的管路对象,并在此对象里处理数据。然后回调。
至此就完成了网络通信模块基本数据的请求