一 常駐線程:
1、2.0 需要常駐線程的作用?
2.0常駐線程,用來併發請求,和處理數據回調;避免多個網絡請求的線程開銷(不用開闢一個線程,就保活一條線程);
2、而3.0不需要常駐線程?
因爲NSURLSession可以指定回調delegateQueue,NSURLConnection而不行;
NSURLConnection的一大痛點就是:發起請求後,而需要一直處於等待回調的狀態。而3.0後NSURLSession解決的這個問題;NSURLSession發起的請求,不再需要在當前線程進行回調,可以指定回調的delegateQueue,這樣就不用爲了等待代理回調方法而保活線程了。
二 最大併發數:
1 、3.0需要設置最大併發數爲1,self.operationQueue.maxConcurrentOperationCount = 1?
串行:讓併發的請求,串行的進行回調;
鎖:且爲了防止多線程資源競爭加了鎖(對 self.mutableTaskDelegatesKeyedByTaskIdentifier(多任務代理) 的訪問進行了加鎖),本來就需要等待,如果多線程併發反而造成資源浪費;
2、2.0爲什麼不需要?
功能不一樣:AF3.0的operationQueue是用來接收NSURLSessionDelegate回調的,鑑於一些多線程數據訪問的安全性考慮,設置了maxConcurrentOperationCount = 1來達到串行回調的效果。
而AF2.0的operationQueue是用來添加operation並進行併發請求的,所以不要設置爲1。
三 總結:
af2.0
1 、保活常駐線程原因:可以避免多個網絡請求,就要保活多個線程;
2 、常駐線程特點:併發請求,和代理回調都在同一線程(常駐線程);所以線程等待回調;
3 、併發請求:系統根據情況控制最大併發數;
4、2.0的operationQueue是用於併發請求的;
af3.0
1 、無需常駐線程原因:因爲NSURLSession可以指定回調的delegateQueue,NSURLConnection而不行;
2 、最大併發數設置:3.0的operationQueue是用於接收NSURLSessionDelegate回調的;
self.operationQueue.maxConcurrentOperationCount = 1,是爲了達到串行回調的效果,況且加了鎖;
備註:
鎖:且爲了防止多線程資源競爭加了鎖(對 self.mutableTaskDelegatesKeyedByTaskIdentifier(多任務代理) 的訪問進行了加鎖),本來就需要等待,如果多線程併發反而造成資源浪費;
參考:http://www.cocoachina.com/ios/20181017/25225.html
AFNetworking的漂亮細節 https://www.jianshu.com/p/ddf79f0763a7
AFNetworking解析