開局一張圖剩下全靠編
目錄結(jié)構(gòu)
AFNetWorking基本上是所有iOS項(xiàng)目的標(biāo)配∨耙耄現(xiàn)在升級(jí)帶最新版的3.X了彭沼。得益于蘋果從NSURLConnection升級(jí)到NSURLSession,AFN也實(shí)現(xiàn)了api的簡(jiǎn)化,同時(shí)功能卻一點(diǎn)沒少。我們來(lái)看一下AFN3.X的目錄結(jié)構(gòu):
1、AFNetWorking 這個(gè)文件是一個(gè)頭文件权薯。啥也沒做姑躲,就是引入了其他文件方便使用。
2盟蚣、AFURLSessionManager 這個(gè)文件是核心類黍析,基本上通過(guò)它來(lái)實(shí)現(xiàn)了大部分核心功能。負(fù)責(zé)請(qǐng)求的建立屎开、管理阐枣、銷毀、安全奄抽、請(qǐng)求重定向蔼两、請(qǐng)求重啟等各種功能。他主要實(shí)現(xiàn)了NSURLSession和NSRULSessionTask的封裝逞度。
3额划、AFHTTPSessionManager 這個(gè)文件是AFURLSessionManager的子類。主要實(shí)現(xiàn)了對(duì)HTTP請(qǐng)求的優(yōu)化档泽。
4俊戳、AFURLRequestSerialization 這個(gè)主要用于請(qǐng)求頭的編碼解碼、序列化茁瘦、優(yōu)化處理品抽、簡(jiǎn)化請(qǐng)求拼接過(guò)程等储笑。
5甜熔、AFURLResponseSerialization 這個(gè)主要用于網(wǎng)絡(luò)返回?cái)?shù)據(jù)的序列化、編碼解碼突倍、序列化腔稀、數(shù)據(jù)處理等。
6羽历、AFSecurityPolicy 這個(gè)主要用于請(qǐng)求的認(rèn)證功能焊虏。比如https的認(rèn)證模式等。
7秕磷、AFNetworkReachabilityManager 這個(gè)主要用于監(jiān)聽網(wǎng)絡(luò)請(qǐng)求狀態(tài)變化功能诵闭。
AFNetwork2.0
底層是通過(guò)封裝NSURLConnection來(lái)實(shí)現(xiàn)的
2.0特點(diǎn)
-常駐線程,用來(lái)并發(fā)請(qǐng)求澎嚣,和處理數(shù)據(jù)回調(diào)疏尿;避免多個(gè)網(wǎng)絡(luò)請(qǐng)求的線程開銷(不用開辟一個(gè)線程,就币滋遥活一條線程)褥琐;
底層是通過(guò)封裝NSURLSession來(lái)實(shí)現(xiàn)的
3.0特點(diǎn)
-NSURLSession可以指定回調(diào)的delegateQueue,不用常駐線程晤郑。
-不用每次都三次握手
3.0為什么不需要常駐線程敌呈?
因?yàn)镹SURLSession可以指定回調(diào)delegateQueue贸宏,NSURLConnection而不行;
NSURLConnection的一大痛點(diǎn)就是:發(fā)起請(qǐng)求后磕洪,而需要一直處于等待回調(diào)的狀態(tài)吭练。而3.0后NSURLSession解決的這個(gè)問(wèn)題;NSURLSession發(fā)起的請(qǐng)求褐鸥,不再需要在當(dāng)前線程進(jìn)行回調(diào)线脚,可以指定回調(diào)的delegateQueue,這樣就不用為了等待代理回調(diào)方法而苯虚牛活線程了浑侥。
最大并發(fā)數(shù):
3.0需要設(shè)置最大并發(fā)數(shù)為1 self.operationQueue.maxConcurrentOperationCount = 1?
- 串行:讓并發(fā)的請(qǐng)求晰绎,串行的進(jìn)行回調(diào)寓落;
- 鎖:且為了防止多線程資源競(jìng)爭(zhēng)加了鎖(對(duì) self.mutableTaskDelegatesKeyedByTaskIdentifier(多任務(wù)代理) 的訪問(wèn)進(jìn)行了加鎖),本來(lái)就需要等待荞下,如果多線程并發(fā)反而造成資源浪費(fèi)伶选;
2.0為什么不需要?
- 功能不一樣:AF3.0的operationQueue是用來(lái)接收NSURLSessionDelegate回調(diào)的尖昏,鑒于一些多線程數(shù)據(jù)訪問(wèn)的安全性考慮仰税,設(shè)置了maxConcurrentOperationCount = 1來(lái)達(dá)到串行回調(diào)的效果。
- 而AF2.0的operationQueue是用來(lái)添加operation并進(jìn)行并發(fā)請(qǐng)求的抽诉,所以不要設(shè)置為1
總結(jié):
AFN2.0
1 陨簇、保活常駐線程原因:可以避免多個(gè)網(wǎng)絡(luò)請(qǐng)求迹淌,就要焙诱溃活多個(gè)線程;
2 唉窃、常駐線程特點(diǎn):并發(fā)請(qǐng)求耙饰,和代理回調(diào)都在同一線程(常駐線程);所以線程等待回調(diào)纹份;
3 苟跪、并發(fā)請(qǐng)求:系統(tǒng)根據(jù)情況控制最大并發(fā)數(shù);
4蔓涧、2.0的operationQueue是用于并發(fā)請(qǐng)求的件已;
AFN3.0
1 、無(wú)需常駐線程原因:因?yàn)镹SURLSession可以指定回調(diào)的delegateQueue蠢笋,NSURLConnection而不行拨齐;
2 、最大并發(fā)數(shù)設(shè)置:3.0的operationQueue是用于接收NSURLSessionDelegate回調(diào)的昨寞;
self.operationQueue.maxConcurrentOperationCount = 1瞻惋,是為了達(dá)到串行回調(diào)的效果厦滤,況且加了鎖;