AFNetworking:2.0常駐線程與3.0最大併發數問題

一 常駐線程:

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解析

https://www.jianshu.com/p/488c1f46cedd

https://www.jianshu.com/p/7ed7c0be15b4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章