? ? ? 一直使用AFNetworking卻從不知道是怎么實現(xiàn)的,這次心血來潮,想看看大牛們是怎么寫代碼的。
看了一下別人寫的AFNetworking的分析,覺得AFNetworkActivityIndicatorManager這個類比較容易看懂,那就從這個類開始閱讀吧。
AFNetworkActivityIndicatorManager是實現(xiàn),當網(wǎng)絡請求的時候,狀態(tài)欄上面的小菊花轉動。
系統(tǒng)自帶的方法是這樣實現(xiàn)的:
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:networkActivityIndicatorVisible];
AFNetworking允許用戶自定義
只要下面的一句代碼即可。
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
具體的實現(xiàn)過程可以參考http://www.cnblogs.com/polobymulberry/p/5081049.html
好的程序應該是低耦合的,我單獨把這個類抽出來寫了一個demo,點擊下載
開始網(wǎng)絡請求的時候,發(fā)送一個通知,AFNetworkActivityIndicatorManager收到通知的時候就開始轉菊花,每收到一個通知,activityCount會+1,同理,暫停請求和完成請求都會發(fā)送一個通知,activityCount會-1。當activityCount減到0的時候,就是所有的網(wǎng)絡請求都完成,就會停止轉菊花。

AFNetworkActivityIndicatorManager類里面有個靜態(tài)函數(shù),是這樣的
static NSURLRequest * AFNetworkRequestFromNotification(NSNotification *notification) {
if ([[notification object] respondsToSelector:@selector(originalRequest)]) {
return [(NSURLSessionTask *)[notification object] originalRequest];
} else {
return nil;
}}
傳進一個通知來返回一個請求實體。內(nèi)部函數(shù)又稱靜態(tài)函數(shù),因為它是static聲明的,使用內(nèi)部函數(shù),可以使函數(shù)的作用域只局限于所在文件,這樣,在不同的文件中即使有同名的內(nèi)部函數(shù),也互不干擾。至于這里為什么用靜態(tài)函數(shù),我也不知道,希望有大神能告訴我。
activityCount代表請求的數(shù)量,當開始一個請求的時候,activityCount+1,完成一個請求的時候activityCount-1,這個類里面用到了KVO來監(jiān)聽activityCount的變化,

KVO可用于檢測對象的某些屬性的實時變化情況并作出響應,因此決定KVO應該做兩件事情,一個是檢測屬性的變化,而是對變化做出響應。像下面這樣(圖片來自網(wǎng)絡)

然而AFNetworking只是對activityCount做了監(jiān)聽,并未做出響應。希望知道的可以告訴我。