iOS 等待block執(zhí)行完成(dispacth semaphore)

  • Block是編程語(yǔ)言層的特質(zhì),它允許你保存一段代碼痢畜,在合適的使用取出來(lái)調(diào)用垛膝。如果對(duì)Block不夠了解,請(qǐng)另查閱相關(guān)資料丁稀,本文章不對(duì)Block做解釋吼拥。

  • Grand Central Dispatch 簡(jiǎn)稱(GCD)是Apple公司開發(fā)的技術(shù),相比NSThread或NSOperation使用方便,并且優(yōu)點(diǎn)是當(dāng)處理器為多核時(shí)能利用多核的特征來(lái)創(chuàng)建線程二驰。它首次發(fā)布在Mac OS X 10.6 扔罪,iOS 4及以上也可用。

  • 我們知道GCD桶雀,但怎么在Block中使用它呢矿酵?答案是dispatch semaphore唬复。需要了解信號(hào)量的createsignalwait全肮。

1. dispatch_semaphore_create => 創(chuàng)建一個(gè)信號(hào)量的初始值
傳入的參數(shù)為long敞咧,輸出一個(gè)dispatch_semaphore_t類型且值為value的信號(hào)量。
值得注意的是辜腺,這里的傳入的參數(shù)value必須大于或等于0休建,否則dispatch_semaphore_create會(huì)返回NULL。

2. dispatch_semaphore_signal => 發(fā)送一個(gè)信號(hào)
這個(gè)函數(shù)會(huì)使傳入的信號(hào)量dsema的值加1评疗。
返回值為long類型测砂,當(dāng)返回值為0時(shí)表示當(dāng)前并沒有線程等待其處理的信號(hào)量,其處理的信號(hào)量的值加1即可百匆。
當(dāng)返回值不為0時(shí)砌些,表示其當(dāng)前有(一個(gè)或多個(gè))線程等待其處理的信號(hào)量,并且該函數(shù)喚醒了一個(gè)等待的線程(當(dāng)線程有優(yōu)先級(jí)時(shí)加匈,喚醒優(yōu)先級(jí)最高的線程存璃;否則隨機(jī)喚醒)。

3. dispatch_semaphore_wait => 等待一個(gè)信號(hào)
這個(gè)函數(shù)會(huì)使傳入的信號(hào)量dsema的值減1雕拼;
如果dsema信號(hào)量的值大于0纵东,該函數(shù)所處線程就繼續(xù)執(zhí)行下面的語(yǔ)句,并且將信號(hào)量的值減1啥寇;
如果desema的值為0偎球,那么這個(gè)函數(shù)就阻塞當(dāng)前線程等待timeout(注意timeout的類型為dispatch_time_t,
不能直接傳入整形或float型數(shù))示姿,如果等待的期間desema的值被dispatch_semaphore_signal函數(shù)加1了甜橱,
且該函數(shù)(即dispatch_semaphore_wait)所處線程獲得了信號(hào)量,那么就繼續(xù)向下執(zhí)行并將信號(hào)量減1栈戳。
如果等待期間沒有獲取到信號(hào)量或者信號(hào)量的值一直為0岂傲,那么等到timeout時(shí),其所處線程自動(dòng)執(zhí)行其后語(yǔ)句子檀。

4. timeout
在設(shè)置timeout時(shí)镊掖,比較有用的兩個(gè)宏:
DISPATCH_TIME_NOW     表示當(dāng)前;
DISPATCH_TIME_FOREVER   表示未來(lái)褂痰;
一般可以直接設(shè)置timeout為這兩個(gè)宏其中的一個(gè)亩进,或者自己創(chuàng)建一個(gè)dispatch_time_t類型的變量。
創(chuàng)建dispatch_time_t類型的變量有兩種方法缩歪,dispatch_time和dispatch_walltime归薛。
利用創(chuàng)建dispatch_time創(chuàng)建dispatch_time_t類型變量的時(shí)候一般也會(huì)用到這兩個(gè)變量。
dispatch_time的聲明如下:
dispatch_time_t dispatch_time(dispatch_time_t when, int64_t delta);
其參數(shù)when需傳入一個(gè)dispatch_time_t類型的變量主籍,和一個(gè)delta值习贫。表示when加delta時(shí)間就是timeout的時(shí)間。
例如:
dispatch_time_t t = dispatch_time(DISPATCH_TIME_NOW, 110001000*1000);
表示當(dāng)前時(shí)間向后延時(shí)一秒為timeout的時(shí)間千元。

  • 現(xiàn)在我們使用dispatch semaphore去實(shí)現(xiàn)等待Block操作結(jié)束苫昌。
  • 單個(gè)Block:
dispatch_semaphore_t sem = dispatch_semaphore_create(0);      
[self methodWithABlock:^(id result){
      //寫block中做的事情
      //結(jié)束等待
      dispatch_semaphore_signal(sem);
}];
//等待信號(hào)
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
  • 多個(gè)Block:
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
[self methodWithABlock:^(id result){
      //寫block中做的事情
      dispatch_semaphore_signal(sem);
}];
[self methodWithABlock:^(id result){
      //寫block中做的事情
      dispatch_semaphore_signal(sem);
}];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
  • Block中的Block
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
[self methodWithABlock:^(id result){
      //寫block中做的事情
      dispatch_semaphore_signal(sem);
      [self methodWithABlock:^(id result){
          //寫block中做的事情
          dispatch_semaphore_signal(sem);
      }];
}];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市物独,隨后出現(xiàn)的幾起案子袜硫,更是在濱河造成了極大的恐慌,老刑警劉巖议纯,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件父款,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡瞻凤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門世杀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)阀参,“玉大人,你說(shuō)我怎么就攤上這事瞻坝≈肟牵” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵所刀,是天一觀的道長(zhǎng)衙荐。 經(jīng)常有香客問(wèn)我,道長(zhǎng)浮创,這世上最難降的妖魔是什么忧吟? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮斩披,結(jié)果婚禮上溜族,老公的妹妹穿的比我還像新娘。我一直安慰自己垦沉,他們只是感情好煌抒,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厕倍,像睡著了一般寡壮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天况既,我揣著相機(jī)與錄音屋群,去河邊找鬼。 笑死坏挠,一個(gè)胖子當(dāng)著我的面吹牛芍躏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播降狠,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼对竣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了榜配?” 一聲冷哼從身側(cè)響起否纬,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛋褥,沒想到半個(gè)月后临燃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烙心,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年膜廊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淫茵。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爪瓜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匙瘪,到底是詐尸還是另有隱情铆铆,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布丹喻,位于F島的核電站薄货,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碍论。R本人自食惡果不足惜谅猾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骑冗。 院中可真熱鬧赊瞬,春花似錦、人聲如沸贼涩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)遥倦。三九已至谤绳,卻和暖如春占锯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缩筛。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工消略, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞎抛。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓艺演,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親桐臊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胎撤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

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

  • Managing Units of Work(管理工作單位) 調(diào)度塊允許您直接配置隊(duì)列中各個(gè)工作單元的屬性。它們還...
    edison0428閱讀 7,995評(píng)論 0 1
  • 鎖是一種同步機(jī)制断凶,用于多線程環(huán)境中對(duì)資源訪問(wèn)的限制iOS中常見鎖的性能對(duì)比圖(摘自:ibireme): iOS鎖的...
    LiLS閱讀 1,524評(píng)論 0 6
  • 原創(chuàng)內(nèi)容,轉(zhuǎn)載請(qǐng)注明出處: http://www.reibang.com/p/ac11fe7ef78c 前言 多線...
    抱緊我的小鯉魚閱讀 8,821評(píng)論 6 78
  • 一、多線程簡(jiǎn)介: 所謂多線程是指一個(gè) 進(jìn)程 -- process(可以理解為系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序)中可以開...
    尋形覓影閱讀 1,043評(píng)論 0 6
  • 自打在簡(jiǎn)書平臺(tái)寫作之后,我就驚訝的發(fā)現(xiàn)稽穆,原來(lái)熱愛寫作的朋友居然這么多冠王,而且大部分都是85后90后的年輕人。這也讓我...
    危笑天閱讀 2,683評(píng)論 44 88