參考:AFNetworking 3.0 源碼解讀(九)之 AFNetworkActivityIndicatorManager
說明:很多內(nèi)容都是摘抄原文,只是根據(jù)自己的需要進行摘抄或者總結,如有不妥請及時指出,謝謝。
AFNetworkActivityIndicatorManager 是對狀態(tài)欄中網(wǎng)絡激活那個小控件的管理。在平時的開發(fā)中,我們很可能忽略了它的存在。然而,實現(xiàn)對它的管理,讓我們的APP更符合人機交互,不也是件大快人心的事兒嗎??聪逻呥@張圖片就明白了:

// 這個宏的意思指下邊的類不能被擴展
NS_EXTENSION_UNAVAILABLE_IOS("Use view controller based solutions where appropriate instead.")
AFNetworkActivityManagerState
激活的四種狀態(tài)
typedef NS_ENUM(NSInteger, AFNetworkActivityManagerState) {
AFNetworkActivityManagerStateNotActive, // 未激活
AFNetworkActivityManagerStateDelayingStart, //激活前的延時階段
AFNetworkActivityManagerStateActive, // 激活
AFNetworkActivityManagerStateDelayingEnd // 取消階段
};
鎖的補充
synchronized是一種鎖,這種鎖不管是在oc中還是java中用的都挺多的,而且這種鎖鎖得是對象。具體原理,可以看這篇文章后邊的 參考 那一部分。
總結一下,鎖一般用于多線程環(huán)境下對數(shù)據(jù)的操作中。在 AFNetworking 中我們見到了3種不同的鎖,分別是:
1、NSLock

2、dispatch_semaphore_wait

3、@synchronized
- image
總結
說一下整個流程吧:
1、當收到 AFNetworking 的AFNetworkingTaskDidResumeNotification通知后,調(diào)用incrementActivityCount方法。
2、在incrementActivityCount方法中把激活數(shù)+1,然后調(diào)用updateCurrentStateForNetworkActivityChange方法更新當前的狀態(tài)。
3、在updateCurrentStateForNetworkActivityChange方法中會設置當前的狀態(tài),也就是調(diào)用setCurrentState:方法。
4、在setCurrentState:方法中通過當前的狀態(tài),來開啟或者關閉定時器,然后調(diào)用setNetworkActivityIndicatorVisible:方法。
5、在setNetworkActivityIndicatorVisible:方法中設置激活狀態(tài)。
