對于iOS開發中的網絡請求模塊,AFNetworking的使用應該是最熟悉不過了,但你是否把握了網絡請求正確的完成時機?什么是信號量?
1.先說什么是信號量。
信號量:就是一種可用來控制訪問資源的數量的標識,設定了一個信號量,在線程訪問之前,加上信號量的處理,則可告知系統按照我們指定的信號量數量來執行多個線程。其實,這有點類似鎖機制了,只不過信號量都是系統幫助我們處理了,我們只需要在執行線程之前,設定一個信號量值,并且在使用時,加上信號量處理方法就行了。
信號量有3個函數,分別是:
創建信號量,參數:信號量的初值
dispatch_semaphore_create(信號量值)
等待降低信號量 dispatch_semaphore_wait(信號量,等待時間)
提高信號量 dispatch_semaphore_signal(信號量)
2.在真實開發中,我們通常會遇到如下問題:
①一個界面存在多個請求,希望所有請求完成之后才去進行下面的操作。
解決方案很容易想到通過線程組進行實現。代碼如下:
對于App請求數據大部分人都會選擇AFNetworking。使用AFN異步請求,請求的數據返回后,就刷新相關UI。如果某一個頁面有多個網絡請求,我們假設有三個請求,request1、request2、request3,而且UI里的數據必須等到request1、request2、request3全部完成后刷新后才顯示。
這里我們就要借助GCD中的信號量dispatch_semaphore進行實現,即營造線程同步情況。
dispatch_semaphore信號量為基于計數器的一種多線程同步機制。用于解決在多個線程訪問共有資源時候,會因為多線程的特性而引發數據出錯的問題。
如果semaphore計數大于等于1,計數-1,返回,程序繼續運行。如果計數為0,則等待。
dispatch_semaphore_signal(semaphore)為計數+1操作。dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)為設置等待時間,這里設置的等待時間是一直等待。
歡迎更多開發者加qq 556120515 群進來交流
把網絡請求進行如下修改:
可以參考下面這篇文章 http://www.lxweimin.com/p/c5a4a3fce93d
具體demo的下載地址https://github.com/xiaoshunliang/OCTestGCD