框架圖
主要類關(guān)系圖
AFURLSessionManager
- 創(chuàng)建和管理NSURLSession、NSURLSessionTask
- 實現(xiàn)NSURLSessionDelegate等協(xié)議的代理方法
- 引入AFSecurityPolicy保證請求安全
- 引入AFNetworkReachabilityManager監(jiān)控網(wǎng)絡(luò)狀態(tài)
NSURLSession:
NSURLSession由三個基本模塊構(gòu)成:
- NSURLSession
- NSURLSessionConfiguation
- NSURLSessionTask
- NSURLSession相對于平時通信中的會話板惑,但本身卻不會進行網(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的進程來管理。也有一些功能上的限制唤崭。
在創(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ò)鏈接,從而加快訪問速度惠毁。
AFNetworking:
AFNetworking是封裝的NSURLSession的網(wǎng)絡(luò)請求
AFNetworking由五個模塊組成:
分別由NSURLSession,Security,Reachability,Serialization,UIKit五部分組成
NSURLSession:網(wǎng)絡(luò)通信模塊(核心模塊) 對應(yīng) AFNetworking中的 AFURLSessionManager和對HTTP協(xié)議進行特殊處理的AFHTTPSessionManager,AFHTTPSessionManager是繼承于AFURLSessionmanager的
Security:網(wǎng)絡(luò)通訊安全策略模塊 對應(yīng) AFSecurityPolicy
Reachability:網(wǎng)絡(luò)狀態(tài)監(jiān)聽模塊 對應(yīng)AFNetworkReachabilityManager
Seriaalization:網(wǎng)絡(luò)通信信息序列化犹芹、反序列化模塊 對應(yīng) AFURLResponseSerialization
UIKit:對于IOSUIKit的擴展庫
網(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進度和upload進度
NSURLSessionDelegate的響應(yīng)
因為AFURLSessionmanager所管理的AFURLSession的delegate指向其自身,因此所有的
NSURLSessiondelegate的回調(diào)地址都是AFURLSessionmanager肝断,而AFURLSessionmanager又會根據(jù)是否需要具體處理會將AF delegate所響應(yīng)的delegate杈曲,傳遞到對應(yīng)的AF delegate去