一一铅、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的擴(kuò)展庫
二、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都是強(qiáng)引用的,只有當(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去