第三方框架 | AFNetworking源碼解析(2) 初始化過程

類結(jié)構(gòu)


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

文件結(jié)構(gòu)

  • 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

AFJSONResponseSerializerAFHTTPResponseSerializer 的子類,用來驗(yàn)證和解碼 JSON 響應(yīng)。默認(rèn)情況下,AFJSONResponseSerializer 接受以下 MIME 類型,其中包括官方標(biāo)準(zhǔn) application/json 以及其他常用類型:

  • application/json
  • text/json
  • text/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(也很重要)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容