dispatch group

dispatch group

有時候我們會有這種需求,在剛進去一個頁面需要發(fā)送兩個請求饮怯,并且某種特定操作必須在兩個請求都結(jié)束(成功或失敗)的時候才會執(zhí)行嚎研,最low的辦法第二個請求嵌套在第一個請求結(jié)果后在發(fā)送蓖墅,在第二個請求結(jié)束后再執(zhí)行操作。還有就是只使用一個Serial

Dispatch Queue临扮,把想要執(zhí)行的操作全部追加到這個Serial Dispatch

Queue中并在最后追加某種特定操作论矾,頗為復雜操作。但是呢杆勇,我們這里介紹更高級的辦法使用dispatch group贪壳。

我們將ABC三個任務block追加到Global Dispatch Queue,ABC全部執(zhí)行完蚜退,會執(zhí)行dispatch_group_notify中的block闰靴。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

dispatch_group_t ?group = dispatch_group_creat();

dispatch_group_async(group,queue钻注,^{執(zhí)行任務A});

dispatch_group_async(group蚂且,queue,^{執(zhí)行任務B});

dispatch_group_async(group幅恋,queue杏死,^{執(zhí)行任務C});

dispatch_group_notify(group,dispatch_get_main_queue(),^{執(zhí)行最終的特定操作});

ABC的執(zhí)行順序不固定,因為是Global Dispatch Queue即Concurrent Dispatch Queue多個現(xiàn)場并行執(zhí)行。

上面的dispatch_group_notify(group,dispatch_get_main_queue(),^{執(zhí)行最終的特定操作});操作還可以更改為

dispatch_group_wait(group,DISPATCH_TIME_FOREVER);

dispatch_group_wait第二個參數(shù)指定為等待的時間(超時)淑翼,屬于dispatch_time_t類型腐巢,在這里使用DISPATCH_TIME_FOREVER,意味著永久等待窒舟。如果dispatch group的處理尚未結(jié)束系忙,就會一直等待诵盼。

如果指定等待時間為1秒如下:

dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 1ull * NESC_PER_SEC)惠豺;

long result = dispatch_group_wait(group,time);

if(result == 0) { dispatch group的全部處理執(zhí)行結(jié)束}

else { dispatch groupe的某一處理還在執(zhí)行中};

但是呢上面這種dispatch_group的排列執(zhí)行方式,是不會考慮block塊內(nèi)部的異步請求情況的风宁,它只能保證把block內(nèi)的非異步直觀代碼執(zhí)行完洁墙,所以如果ABC三個任務中如果有執(zhí)行異步的請求,那么在dispatch_group_notify最終任務執(zhí)行中戒财,那個異步請求不一定毀掉結(jié)束热监。

在這里給大家介紹針對這種問題另一個API。

dispatch_group_enter/dispatch_group_leave

dispatch_group_t group = disoatch_group_creat();

dispatch_group_enter(group);

dispatch_async(dispath_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{

//在這里執(zhí)行異步請求A

并且在執(zhí)行結(jié)束代碼(成功或失敗)中寫上dispatch_group_leave(group);

});

dispatch_async(dispath_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{

//在這里執(zhí)行異步請求B

并且在執(zhí)行結(jié)束代碼(成功或失敗)中寫上dispatch_group_leave(group);

});

dispatch_group_notify(group,dispatch_get_main_queue(),^{執(zhí)行最終的特定操作});

上面這種做法當執(zhí)行到dispatch_group_notify饮寞,一定是AB兩個異步請求都加在結(jié)束了孝扛。dispatch_group_enter(group)和dispatch_group_leave(group);必須成對出現(xiàn),編譯器會強制識別當出現(xiàn)dispatch_group_leave全部結(jié)束才執(zhí)行dispatch_group_notify幽崩,即使這種苦始,檔異步執(zhí)行了AB兩個請求,也不能保證請求執(zhí)行結(jié)束的先后順序慌申,如果任務B的請求參數(shù)包含請求A的返回參數(shù)陌选,那么只能用最Low的辦法將請求B嵌套在A中執(zhí)行,當然如果你有更好的辦法歡迎提出來哈蹄溉。

最近的項目正好有多個請求并發(fā)執(zhí)行咨油,但需要返回所有請求的結(jié)果之后,再更新界面的需求柒爵,正好用到dispatch group役电,還比較滿足需求,但是碰到任務B的請求參數(shù)包含請求A的返回參數(shù)這種情況也有可能棉胀,還真是需要找一個優(yōu)雅的姿勢解決這種情況宴霸。

轉(zhuǎn)自:http://www.cocoachina.com/ios/20160804/17291.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市膏蚓,隨后出現(xiàn)的幾起案子瓢谢,更是在濱河造成了極大的恐慌,老刑警劉巖驮瞧,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氓扛,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機采郎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門千所,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒜埋,你說我怎么就攤上這事淫痰。” “怎么了整份?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵待错,是天一觀的道長。 經(jīng)常有香客問我烈评,道長火俄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任讲冠,我火速辦了婚禮瓜客,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘竿开。我一直安慰自己谱仪,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布否彩。 她就那樣靜靜地躺著疯攒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胳搞。 梳的紋絲不亂的頭發(fā)上卸例,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音肌毅,去河邊找鬼筷转。 笑死,一個胖子當著我的面吹牛悬而,可吹牛的內(nèi)容都是我干的呜舒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼笨奠,長吁一口氣:“原來是場噩夢啊……” “哼袭蝗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起般婆,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤到腥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蔚袍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乡范,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡配名,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了晋辆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渠脉。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瓶佳,靈堂內(nèi)的尸體忽然破棺而出芋膘,到底是詐尸還是另有隱情,我是刑警寧澤霸饲,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布为朋,位于F島的核電站,受9級特大地震影響贴彼,放射性物質(zhì)發(fā)生泄漏潜腻。R本人自食惡果不足惜埃儿,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一器仗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧童番,春花似錦精钮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至幼东,卻和暖如春臂容,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背根蟹。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工脓杉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人简逮。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓球散,卻偏偏與公主長得像,于是被迫代替她去往敵國和親散庶。 傳聞我的和親對象是個殘疾皇子蕉堰,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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