AFNetworking 底層原理分析

一、AFNetworking 底層原理分析

  • AFNetworking是封裝的NSURLSession的網(wǎng)絡(luò)請求,由五個模塊組成:分別由NSURLSession,Security,Reachability,Serialization,UIKit五部分組成

1、NSURLSession:網(wǎng)絡(luò)通信模塊(核心模塊) 對應(yīng) AFNetworking中的AFURLSessionManager和對HTTP協(xié)議進(jìn)行特化處理的AFHTTPSessionManager,AFHTTPSessionManager是繼承于AFURLSessionmanager的

2、Security:網(wǎng)絡(luò)通訊安全策略模塊 對應(yīng) AFSecurityPolicy

3、Reachability:網(wǎng)絡(luò)狀態(tài)監(jiān)聽模塊 對應(yīng)AFNetworkReachabilityManager

4、Seriaalization:網(wǎng)絡(luò)通信信息序列化、反序列化模塊 對應(yīng) AFURLResponseSerialization

5、UIKit:對于iOS UIKit的擴展庫

二、NSURLSession:

NSURLSession由三個基本模塊構(gòu)成:

NSURLSession
NSURLSessionConfiguation
NSURLSessionTask

NSURLSession相對于平時通信中的會話,但本身卻不會進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)傳輸,它會穿件多個NSURLSessionTask去執(zhí)行每次的網(wǎng)絡(luò)請求

NSURLSession的行為取決于三個方面。包括NSURLSession的類型、NSURLSessionTask的類型和在創(chuàng)建task時APP是否處于前端

NSURLSession有三種類型

defaultSession將cache和creditials儲存于本地

Ephemeral Session對數(shù)據(jù)更加保密安全,并不會向本地儲存任何數(shù)據(jù),將cache和creditials儲存在內(nèi)存中,并和Session綁定,當(dāng)Session銷毀時,對應(yīng)的數(shù)據(jù)也會被銷毀。

backgroundSession可以時APP處于后臺時繼續(xù)數(shù)據(jù)傳輸,其行為與defaultSession類似,但是所有的數(shù)據(jù)傳輸均由一個非本APP的進(jìn)程來管理。也有一些功能上的限制。

在創(chuàng)建Session對象時通過NSURLSessionConfigration來配置,可設(shè)置Session的delegate

Session一但配置完成,就不能修改,除非創(chuàng)建一個新的Session對象。

NSURLSessionTask包括三種Task類型,分別為:NSURLSessionDataTask,NSURLSessionDownLoadTask,NSURLSessionUploadTask

所有的Task狀態(tài)都是暫停的,需要用[Task resume]啟動Task

NSURLSession有兩種獲取數(shù)據(jù)的方式:

初始化session時指定delegate,在代理方法中返回數(shù)據(jù),需要實現(xiàn)NSURLSession的兩個代理方法

初始化Session時未指定delegate的,通過block回調(diào)返回數(shù)據(jù)。

NSURLSession對象的銷毀,有兩種銷毀模式:

  • (void)invalidateAndCancel 取消該Session中的所有Task,銷毀所有delegate、block和Session自身,調(diào)用后Session不能再復(fù)用。

  • (void)finishTasksAndInvalidate 會立即返回,但不會取消已啟動的task,而是當(dāng)這些task完成時,調(diào)用delegate

這里有個地方需要注意,即:NSURLSession對象對其delegate都是強引用的,只有當(dāng)Session對象invalidate, 才會釋放delegate,否則會出現(xiàn)memory leak。

使用Session加速網(wǎng)絡(luò)訪問速度,使用同一個Session中的task訪問數(shù)據(jù),不用每次都實現(xiàn)三次握手,復(fù)用之前服務(wù)器和客戶端之間的網(wǎng)絡(luò)鏈接,從而加快訪問速度。

三、網(wǎng)絡(luò)請求的過程:

創(chuàng)建NSURLSessionConfig對象–用創(chuàng)建的config對象配置初始化NSURLSession–創(chuàng)建NSURLSessionTask對象并resume執(zhí)行,用delegate或者block回調(diào)返回數(shù)據(jù)。

AFURLSessionManager封裝了上述網(wǎng)絡(luò)交互功能

AFURLSessionManager請求過程

1.初始化AFURLSessionManager。

2.獲取AFURLSessionManager的Task對象

3.啟動Task

AFURLSessionManager會為每一個Task創(chuàng)建一個AFURLSessionmanagerTaskDelegate對象,manager會讓其處理各個Task的具體事務(wù),從而實現(xiàn)了manager對多個Task的管理

初始化好manager后,獲取一個網(wǎng)絡(luò)請求的Task,生成一個Task對象,并創(chuàng)建了一個AFURLSessionmanagerTaskDelegate并將其關(guān)聯(lián),設(shè)置Task的上傳和下載delegate,通過KVO監(jiān)聽download進(jìn)度和upload進(jìn)度

四、NSURLSessionDelegate的響應(yīng)

因為AFURLSessionmanager所管理的AFURLSession的delegate指向其自身,因此所有的

NSURLSessiondelegate的回調(diào)地址都是AFURLSessionmanager,而AFURLSessionmanager又會根據(jù)是否需要具體處理會將AF delegate所響應(yīng)的delegate,傳遞到對應(yīng)的AF delegate去

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

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

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