類結(jié)構(gòu)
今天主要對(duì) AFNetworking 的初始化過程進(jìn)行整理,首先看一下文件結(jié)構(gòu)圖,這里除 UIKit 部分一共包括6個(gè)類:AFHTTPSessionManager,AFURLSessionManager,AFSecurityPolicy,AFURLRequestSerialization,AFURLResponseSerialization和AFNetworkReachabilityManager。

-
AFHTTPSessionManager:
繼承于AFURLSessionManager,通常在項(xiàng)目中直接使用AFHTTPSessionManager類,負(fù)責(zé)處理網(wǎng)絡(luò)請(qǐng)求和響應(yīng)。 -
AFURLSessionManager:
AFNetworking 的核心類,初始化NSURLSession等對(duì)象并實(shí)現(xiàn)了相關(guān)協(xié)議。 -
AFSecurityPolicy:
負(fù)責(zé)身份驗(yàn)證 -
AFURLRequestSerialization:
負(fù)責(zé)序列化請(qǐng)求 -
AFURLResponseSerialization:
負(fù)責(zé)序列化響應(yīng) -
AFNetworkReachabilityManager:
負(fù)責(zé)檢測網(wǎng)絡(luò)連接狀態(tài)
初始化

我們?cè)诔跏蓟牡胤皆O(shè)置斷點(diǎn),通過調(diào)用??梢砸徊讲接^察到
AFHTTPSessionManager 對(duì)象的初始化過程。正如之前所提 AFHTTPSessionManager 繼承自 AFURLSessionManager ,可以知道 initWithSessionConfiguration: 就是核心初始化方法。接下來我們看一下這個(gè)方法里面做了哪些事:
- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration {
self = [super init];
if (!self) {
return nil;
}
// 初始化NSURLSessionConfiguration對(duì)象
if (!configuration) {
configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
}
self.sessionConfiguration = configuration;
// 初始化操作隊(duì)列,并設(shè)置最大并發(fā)數(shù)為1
self.operationQueue = [[NSOperationQueue alloc] init];
self.operationQueue.maxConcurrentOperationCount = 1;
// 使用NSURLSessionConfiguration對(duì)象和隊(duì)列對(duì)象初始化NSURLSession對(duì)象,并設(shè)置代理
self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];
// 初始化響應(yīng)序列器,默認(rèn)響應(yīng)JSON數(shù)據(jù)
self.responseSerializer = [AFJSONResponseSerializer serializer];
// 初始化AFSecurityPolicy對(duì)象,負(fù)責(zé)證書安全認(rèn)證
self.securityPolicy = [AFSecurityPolicy defaultPolicy];
// 初始化網(wǎng)絡(luò)監(jiān)測器,用于檢測網(wǎng)絡(luò)連接狀態(tài)
#if !TARGET_OS_WATCH
self.reachabilityManager = [AFNetworkReachabilityManager sharedManager];
#endif
self.mutableTaskDelegatesKeyedByTaskIdentifier = [[NSMutableDictionary alloc] init];
self.lock = [[NSLock alloc] init];
self.lock.name = AFURLSessionManagerLockName;
// 設(shè)置代理
[self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
// 設(shè)置數(shù)據(jù)任務(wù)代理
for (NSURLSessionDataTask *task in dataTasks) {
[self addDelegateForDataTask:task uploadProgress:nil downloadProgress:nil completionHandler:nil];
}
// 設(shè)置上傳任務(wù)代理
for (NSURLSessionUploadTask *uploadTask in uploadTasks) {
[self addDelegateForUploadTask:uploadTask progress:nil completionHandler:nil];
}
// 設(shè)置下載任務(wù)代理
for (NSURLSessionDownloadTask *downloadTask in downloadTasks) {
[self addDelegateForDownloadTask:downloadTask progress:nil destination:nil completionHandler:nil];
}
}];
return self;
}
說明
NSURLSessionConfiguration
NSURLSessionConfiguration 對(duì)象定義了使用 NSURLSession 對(duì)象上傳和下載數(shù)據(jù)時(shí)要使用的行為和策略。在上傳或下載數(shù)據(jù)時(shí),創(chuàng)建配置對(duì)象總是您必須采取的第一步。您可以使用該對(duì)象來配置超時(shí)值、緩存策略、連接需求和其他類型的信息,這些信息是您打算與 NSURLSession 對(duì)象一起使用的。
在使用 NSURLSessionConfiguration 對(duì)象初始化會(huì)話對(duì)象之前,適當(dāng)?shù)嘏渲?NSURLSessionConfiguration 對(duì)象是非常重要的。會(huì)話對(duì)象復(fù)制您提供的配置設(shè)置并使用這些設(shè)置來配置會(huì)話。一旦配置好,會(huì)話對(duì)象就會(huì)忽略對(duì) NSURLSessionConfiguration 對(duì)象所做的任何更改。如果需要修改傳輸策略,則必須更新會(huì)話配置對(duì)象并使用它創(chuàng)建新的 NSURLSession 對(duì)象。
AFJSONResponseSerializer
AFJSONResponseSerializer 是 AFHTTPResponseSerializer 的子類,用來驗(yàn)證和解碼 JSON 響應(yīng)。默認(rèn)情況下,AFJSONResponseSerializer 接受以下 MIME 類型,其中包括官方標(biāo)準(zhǔn) application/json 以及其他常用類型:
application/jsontext/jsontext/javascript
在RFC 7159 - 8.1節(jié)中,它指出JSON文本需要用UTF-8、UTF-16或UTF-32編碼,默認(rèn)編碼是UTF-8。NSJSONSerialization 提供了對(duì)規(guī)范中列出的所有編碼的支持,并推薦使用UTF-8來提高效率。使用不支持的編碼將導(dǎo)致序列化錯(cuò)誤。有關(guān)詳細(xì)信息,請(qǐng)參閱“NSJSONSerialization”文檔。
總結(jié)
在該初始化方法中,它做了這么幾件事:
(1)初始化會(huì)話配置(session configuration)默認(rèn)為 defaultSessionConfiguration
(2)初始化隊(duì)列,設(shè)置隊(duì)列的最大并發(fā)數(shù)為1
(3)初始化會(huì)話(session),并將 session 的代理對(duì)象設(shè)置為 self(也就是當(dāng)前 AFURLSessionManager 對(duì)象),并將代理隊(duì)列設(shè)置為(2)中創(chuàng)建的隊(duì)列。
(4)初始化響應(yīng)序列化
(5)初始化安全認(rèn)證
(6)初始化網(wǎng)絡(luò)狀態(tài)監(jiān)控
(7)初始化保存 NSURLSessionDataTask 的字典(很重要)
(8)初始化線程鎖(很重要)
(9)最后一大坨代碼是為已經(jīng)存在的 task 設(shè)置 delegate(也很重要)