AFNetworking是封裝的NSURLSession的網(wǎng)絡(luò)請(qǐng)求瓦戚,由五個(gè)模塊組成:
NSURLSession:
網(wǎng)絡(luò)通信模塊(核心模塊) 對(duì)應(yīng) AFNetworking中的 AFURLSessionManager和對(duì)HTTP協(xié)議進(jìn)行優(yōu)化處理的AFHTTPSessionManager,AFHTTPSessionManager是繼承于AFURLSessionmanager
NSURLSession由三個(gè)基本模塊構(gòu)成:
NSURLSession
NSURLSessionConfiguation
NSURLSessionTask
NSURLSession相對(duì)于平時(shí)通信中的會(huì)話,但本身卻不會(huì)進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)傳輸堵漱,它會(huì)創(chuàng)建多個(gè)NSURLSessionTask去執(zhí)行每次網(wǎng)絡(luò)請(qǐng)求
NSURLSession的行為取決于三個(gè)方面。包括NSURLSession的類型岖妄、NSURLSessionTask的類型和在創(chuàng)建task時(shí)APP是否處于前端
NSURLSession有三種類型
defaultSession將cache和creditials儲(chǔ)存于本地
Ephemeral Session對(duì)數(shù)據(jù)更加保密安全,并不會(huì)向本地儲(chǔ)存任何數(shù)據(jù)珍逸,將cache和creditials儲(chǔ)存在內(nèi)存中吵取,并和Session綁定禽额,當(dāng)Session銷毀時(shí),對(duì)應(yīng)的數(shù)據(jù)也會(huì)被銷毀皮官。
backgroundSession可以時(shí)APP處于后臺(tái)時(shí)繼續(xù)數(shù)據(jù)傳輸脯倒,其行為與defaultSession類似,但是所有的數(shù)據(jù)傳輸均由一個(gè)非本APP的進(jìn)程來(lái)管理臣疑。也有一些功能上的限制盔憨。
在創(chuàng)建Session對(duì)象時(shí)通過(guò)NSURLSessionConfigration來(lái)配置,可設(shè)置Session的delegate
Session一但配置完成讯沈,就不能修改郁岩,除非創(chuàng)建一個(gè)新的Session對(duì)象。
NSURLSessionTask包括三種Task類型,分別為:NSURLSessionDataTask碗暗,NSURLSessionDownLoadTask奕锌,NSURLSessionUploadTask
所有的Task狀態(tài)都是暫停的,需要用[Task resume]啟動(dòng)Task
NSURLSession有兩種獲取數(shù)據(jù)的方式:
初始化session時(shí)指定delegate如叼,在代理方法中返回?cái)?shù)據(jù),需要實(shí)現(xiàn)NSURLSession的兩個(gè)代理方法
初始化Session時(shí)未指定delegate的穷劈,通過(guò)block回調(diào)返回?cái)?shù)據(jù)笼恰。
NSURLSession對(duì)象的銷毀,有兩種銷毀模式:
- (void)invalidateAndCancel 取消該Session中的所有Task歇终,銷毀所有delegate社证、block和Session自身,調(diào)用后Session不能再?gòu)?fù)用评凝。
- (void)finishTasksAndInvalidate 會(huì)立即返回追葡,但不會(huì)取消已啟動(dòng)的task,而是當(dāng)這些task完成時(shí),調(diào)用delegate
這里有個(gè)地方需要注意宜肉,即:NSURLSession對(duì)象對(duì)其delegate都是強(qiáng)引用的匀钧,只有當(dāng)Session對(duì)象invalidate, 才會(huì)釋放delegate谬返,否則會(huì)出現(xiàn)memory leak之斯。
使用Session加速網(wǎng)絡(luò)訪問(wèn)速度,使用同一個(gè)Session中的task訪問(wèn)數(shù)據(jù)朱浴,不用每次都實(shí)現(xiàn)三次握手吊圾,復(fù)用之前服務(wù)器和客戶端之間的網(wǎng)絡(luò)鏈接,從而加快訪問(wèn)速度
Security:
網(wǎng)絡(luò)通訊安全策略模塊翰蠢,提供安全相關(guān)的操作接口? 對(duì)應(yīng) AFSecurityPolicy
Reachability:
網(wǎng)絡(luò)狀態(tài)監(jiān)聽(tīng)模塊项乒,提供網(wǎng)絡(luò)狀態(tài)的接口 對(duì)應(yīng)AFNetworkReachabilityManager
Serialization:
網(wǎng)絡(luò)通信信息序列化、反序列化模塊梁沧,提供解析數(shù)據(jù)的相關(guān)接口 對(duì)應(yīng) AFURLRequestSerialization和AFURLResponseSerialization
UIKit:
對(duì)于IOSUIKit的擴(kuò)展庫(kù)檀何,提供大量網(wǎng)路請(qǐng)求過(guò)程中與UI界面相關(guān)的接口
網(wǎng)絡(luò)請(qǐng)求的過(guò)程:
創(chuàng)建NSURLSessionConfig對(duì)象--用創(chuàng)建的config對(duì)象配置初始化NSURLSession--創(chuàng)建NSURLSessionTask對(duì)象并resume執(zhí)行,用delegate或者block回調(diào)返回?cái)?shù)據(jù)廷支。
AFURLSessionManager封裝了上述網(wǎng)絡(luò)交互功能
AFURLSessionManager請(qǐng)求過(guò)程
1.初始化AFURLSessionManager频鉴。
2.獲取AFURLSessionManager的Task對(duì)象
3.啟動(dòng)Task
AFURLSessionManager會(huì)為每一個(gè)Task創(chuàng)建一個(gè)AFURLSessionmanagerTaskDelegate對(duì)象,manager會(huì)讓其處理各個(gè)Task的具體事務(wù)恋拍,從而實(shí)現(xiàn)了manager對(duì)多個(gè)Task的管理
初始化好manager后垛孔,獲取一個(gè)網(wǎng)絡(luò)請(qǐng)求的Task,生成一個(gè)Task對(duì)象施敢,并創(chuàng)建了一個(gè)AFURLSessionmanagerTaskDelegate并將其關(guān)聯(lián)周荐,設(shè)置Task的上傳和下載delegate,通過(guò)KVO監(jiān)聽(tīng)download進(jìn)度和upload進(jìn)度
NSURLSessionDelegate的響應(yīng)
因?yàn)锳FURLSessionmanager所管理的AFURLSession的delegate指向其自身僵娃,因此所有的NSURLSessiondelegate的回調(diào)地址都是AFURLSessionmanager概作,而AFURLSessionmanager又會(huì)根據(jù)是否需要具體處理會(huì)將AF delegate所響應(yīng)的delegate,傳遞到對(duì)應(yīng)的AF delegate去