一、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去