對(duì)于iOS開發(fā)中的網(wǎng)絡(luò)請(qǐng)求模塊桥言,AFNetworking的使用應(yīng)該是最熟悉不過了坤邪,但你是否把握了網(wǎng)絡(luò)請(qǐng)求正確的完成時(shí)機(jī)?什么是信號(hào)量谒府?
1.先說什么是信號(hào)量。
信號(hào)量:就是一種可用來控制訪問資源的數(shù)量的標(biāo)識(shí)浮毯,設(shè)定了一個(gè)信號(hào)量完疫,在線程訪問之前,加上信號(hào)量的處理债蓝,則可告知系統(tǒng)按照我們指定的信號(hào)量數(shù)量來執(zhí)行多個(gè)線程壳鹤。其實(shí),這有點(diǎn)類似鎖機(jī)制了饰迹,只不過信號(hào)量都是系統(tǒng)幫助我們處理了芳誓,我們只需要在執(zhí)行線程之前,設(shè)定一個(gè)信號(hào)量值啊鸭,并且在使用時(shí)锹淌,加上信號(hào)量處理方法就行了。
信號(hào)量有3個(gè)函數(shù)赠制,分別是:
創(chuàng)建信號(hào)量赂摆,參數(shù):信號(hào)量的初值?
dispatch_semaphore_create(信號(hào)量值)
等待降低信號(hào)量 ?dispatch_semaphore_wait(信號(hào)量,等待時(shí)間)
提高信號(hào)量?dispatch_semaphore_signal(信號(hào)量)
2.在真實(shí)開發(fā)中,我們通常會(huì)遇到如下問題:
①一個(gè)界面存在多個(gè)請(qǐng)求库正,希望所有請(qǐng)求完成之后才去進(jìn)行下面的操作曲楚。
解決方案很容易想到通過線程組進(jìn)行實(shí)現(xiàn)。代碼如下:
打印結(jié)果如下:
我們換成真是的網(wǎng)絡(luò)請(qǐng)求再看一下喷楣。
對(duì)于App請(qǐng)求數(shù)據(jù)大部分人都會(huì)選擇AFNetworking。使用AFN異步請(qǐng)求鹤树,請(qǐng)求的數(shù)據(jù)返回后铣焊,就刷新相關(guān)UI。如果某一個(gè)頁面有多個(gè)網(wǎng)絡(luò)請(qǐng)求罕伯,我們假設(shè)有三個(gè)請(qǐng)求曲伊,request1、request2追他、request3坟募,而且UI里的數(shù)據(jù)必須等到request1、request2邑狸、request3全部完成后刷新后才顯示懈糯。
這里我們書寫一個(gè)網(wǎng)絡(luò)請(qǐng)求通用方法。使用我們最常用的AFNet請(qǐng)求单雾,方法如下:
打印結(jié)果如下:
這里我們就要借助GCD中的信號(hào)量dispatch_semaphore進(jìn)行實(shí)現(xiàn),即營(yíng)造線程同步情況买羞。
dispatch_semaphore信號(hào)量為基于計(jì)數(shù)器的一種多線程同步機(jī)制袁勺。用于解決在多個(gè)線程訪問共有資源時(shí)候,會(huì)因?yàn)槎嗑€程的特性而引發(fā)數(shù)據(jù)出錯(cuò)的問題畜普。
如果semaphore計(jì)數(shù)大于等于1期丰,計(jì)數(shù)-1,返回,程序繼續(xù)運(yùn)行钝荡。如果計(jì)數(shù)為0街立,則等待。
dispatch_semaphore_signal(semaphore)為計(jì)數(shù)+1操作埠通。dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)為設(shè)置等待時(shí)間赎离,這里設(shè)置的等待時(shí)間是一直等待。
把網(wǎng)絡(luò)請(qǐng)求進(jìn)行如下修改:
實(shí)例地址:點(diǎn)擊去下載