使用GCD中的dispatch_semaphore(信號(hào)量)處理一個(gè)界面多個(gè)請(qǐng)求(把握AFNet網(wǎng)絡(luò)請(qǐng)求完成的正確時(shí)機(jī))

對(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é)果如下:

打印結(jié)果觀察可能并沒有什么問題褥符,但需要注意的是request1 request2 request3等在真實(shí)開發(fā)中通常對(duì)應(yīng)為某個(gè)網(wǎng)絡(luò)請(qǐng)求。而網(wǎng)絡(luò)請(qǐng)求通常為異步抚垃,那這時(shí)是否還會(huì)有同樣結(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)求单雾,方法如下:


request2 request3分別請(qǐng)求對(duì)應(yīng)的下面的數(shù)據(jù)赚哗,就不重復(fù)寫了,文章末尾會(huì)把demo地址附上硅堆,感興趣的可以下載來看一下屿储。

打印結(jié)果如下:


運(yùn)行后馬上接收到了線程組完成的提示,之后數(shù)據(jù)才依次請(qǐng)求下來渐逃,很明顯三個(gè)單純的AFNetworking請(qǐng)求已經(jīng)不能滿足我們的需求了够掠。線程組完成時(shí)并沒有在我們希望的時(shí)候給予通知。在真實(shí)開發(fā)中會(huì)造成的問題為多個(gè)請(qǐng)求均加載完成朴乖,但界面已在未得到數(shù)據(jù)前提前刷新導(dǎo)致界面空白祖屏。

這里我們就要借助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)行如下修改:


通過信號(hào)量dispatch_semaphore完美的解決了此問題端辱,并且網(wǎng)絡(luò)請(qǐng)求仍為異步梁剔,不會(huì)堵塞當(dāng)前主線程。

實(shí)例地址:點(diǎn)擊去下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舞蔽,一起剝皮案震驚了整個(gè)濱河市荣病,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渗柿,老刑警劉巖个盆,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異朵栖,居然都是意外死亡颊亮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門混槐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來编兄,“玉大人,你說我怎么就攤上這事声登『菰В” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵悯嗓,是天一觀的道長(zhǎng)件舵。 經(jīng)常有香客問我,道長(zhǎng)脯厨,這世上最難降的妖魔是什么铅祸? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮合武,結(jié)果婚禮上临梗,老公的妹妹穿的比我還像新娘。我一直安慰自己稼跳,他們只是感情好盟庞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汤善,像睡著了一般什猖。 火紅的嫁衣襯著肌膚如雪票彪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天不狮,我揣著相機(jī)與錄音降铸,去河邊找鬼。 笑死摇零,一個(gè)胖子當(dāng)著我的面吹牛推掸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播遂黍,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼终佛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了雾家?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤绍豁,失蹤者是張志新(化名)和其女友劉穎芯咧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竹揍,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敬飒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芬位。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片无拗。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖昧碉,靈堂內(nèi)的尸體忽然破棺而出英染,到底是詐尸還是另有隱情,我是刑警寧澤被饿,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布四康,位于F島的核電站,受9級(jí)特大地震影響狭握,放射性物質(zhì)發(fā)生泄漏闪金。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一论颅、第九天 我趴在偏房一處隱蔽的房頂上張望哎垦。 院中可真熱鬧,春花似錦恃疯、人聲如沸漏设。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愿题。三九已至损俭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間潘酗,已是汗流浹背杆兵。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仔夺,地道東北人琐脏。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像缸兔,于是被迫代替她去往敵國(guó)和親日裙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容