GCD-柵欄函數(shù) dispatch_barrier_async

  1. dispatch_groupdispatch_barrier 的區(qū)別捻勉?
    案例1:如果有A刀森、B、C 三個任務(wù)埠偿,需要三個任務(wù)(可能耗時)執(zhí)行結(jié)束后再執(zhí)行任務(wù)D榜晦,怎么實現(xiàn)?
  • 第一種方案使用 dispatch_group 注意:dispatch_group_enterdispatch_group_leave 是成對出現(xiàn)
NSLog(@"dispatch_group");

dispatch_queue_t queue = dispatch_queue_create("com.test.queue", DISPATCH_QUEUE_CONCURRENT);

dispatch_group_t group = dispatch_group_create();

dispatch_group_enter(group);
dispatch_async(queue, ^{
    NSLog(@"開始任務(wù)A");
    [NSThread sleepForTimeInterval:3];
    NSLog(@"結(jié)束任務(wù)A");
    dispatch_group_leave(group);
});

dispatch_group_enter(group);
dispatch_async(queue, ^{
    NSLog(@"開始任務(wù)B");
    [NSThread sleepForTimeInterval:2];
    NSLog(@"結(jié)束任務(wù)B");
    dispatch_group_leave(group);
});

dispatch_group_enter(group);
dispatch_async(queue, ^{
    NSLog(@"開始任務(wù)C");
    [NSThread sleepForTimeInterval:1];
    NSLog(@"結(jié)束任務(wù)C");
    dispatch_group_leave(group);
});

// 當(dāng)所有任務(wù)執(zhí)行結(jié)束后才執(zhí)行以下代碼
dispatch_group_notify(group, queue, ^{
    NSLog(@"----------> group <----------");
    NSLog(@"開始任務(wù)D");
});

我們看下打印結(jié)果:


dispatch_group.png
  • 第二種方案:使用 dispatch_barrier_async
NSLog(@"dispatch_barrier");

dispatch_queue_t queue = dispatch_queue_create("com.test.queue", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{
    NSLog(@"開始任務(wù)A,來自線程:%@",[NSThread currentThread]);
    [NSThread sleepForTimeInterval:3];
    NSLog(@"結(jié)束任務(wù)A");
});
dispatch_async(queue, ^{
    NSLog(@"開始任務(wù)B");
    [NSThread sleepForTimeInterval:2];
    NSLog(@"結(jié)束任務(wù)B");
});
dispatch_async(queue, ^{
    NSLog(@"開始任務(wù)C");
    [NSThread sleepForTimeInterval:1];
    NSLog(@"結(jié)束任務(wù)C");
});
// 柵欄函數(shù)
dispatch_barrier_async(queue, ^{
    NSLog(@"----------> barrier <----------");
});

dispatch_async(queue, ^{
    NSLog(@"開始任務(wù)D");
});

我們再看下打印結(jié)果:


dispatch_barrier.png

我們發(fā)現(xiàn) dispatch_barrier_async 阻塞了下面的代碼,必須等到上面代碼(耗時)執(zhí)行結(jié)束之后才執(zhí)行下面的代碼愁憔。然而,如果我們把柵欄函數(shù)注釋了再看下打印結(jié)果:

刪除柵欄函數(shù)結(jié)果

但是半抱,我們還是發(fā)現(xiàn) dispatch_groupdispatch_barrier_async 都能實現(xiàn)以上需求膜宋,這尼瑪沒區(qū)別啊秋茫,不著急,慢慢看下面這個需求肛著。

案例2:如果有A跺讯、B殉农、C 三個任務(wù),需要三個任務(wù)分別按照順序執(zhí)行結(jié)束后再執(zhí)行任務(wù)D愈污,怎么實現(xiàn)呢聪建?

dispatch_queue_t queue = dispatch_queue_create("com.test.queue", DISPATCH_QUEUE_CONCURRENT);

dispatch_barrier_async(queue, ^{
    NSLog(@"開始任務(wù)A");
    [NSThread sleepForTimeInterval:1];
    NSLog(@"結(jié)束任務(wù)A");
});
dispatch_barrier_async(queue, ^{
    NSLog(@"開始任務(wù)B");
    [NSThread sleepForTimeInterval:2];
    NSLog(@"結(jié)束任務(wù)B");
});
dispatch_barrier_async(queue, ^{
    NSLog(@"開始任務(wù)C");
    [NSThread sleepForTimeInterval:3];
    NSLog(@"結(jié)束任務(wù)C");
});

dispatch_barrier_async(queue, ^{
    NSLog(@"----------> A B C 有順序 <----------");
    NSLog(@"開始任務(wù)D");
});

我們看下打印結(jié)果:


有順序執(zhí)行A、B擎析、C任務(wù)
  1. 我們再聊聊柵欄函數(shù) dispatch_barrier_async挥下,看看下面這段代碼:
NSLog(@"dispatch_barrier");
NSLog(@"---------- 1111111111 ----------");

dispatch_queue_t queue = dispatch_queue_create("com.test.queue", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{
    NSLog(@"開始任務(wù)A,來自線程:%@",[NSThread currentThread]);
    [NSThread sleepForTimeInterval:3];
    NSLog(@"結(jié)束任務(wù)A现斋,來自線程:%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
    NSLog(@"開始任務(wù)B偎蘸,來自線程:%@",[NSThread currentThread]);
    [NSThread sleepForTimeInterval:2];
    NSLog(@"結(jié)束任務(wù)B,來自線程:%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
    NSLog(@"開始任務(wù)C限书,來自線程:%@",[NSThread currentThread]);
    [NSThread sleepForTimeInterval:1];
    NSLog(@"結(jié)束任務(wù)C章咧,來自線程:%@",[NSThread currentThread]);
});
NSLog(@"---------- 2222222222 ----------");
// 柵欄函數(shù)
dispatch_barrier_async(queue, ^{
    NSLog(@"----------> barrier <----------");
});

dispatch_async(queue, ^{
    NSLog(@"開始任務(wù)D,來自線程:%@",[NSThread currentThread]);
});
NSLog(@"---------- 3333333333 ----------");

先看下輸出結(jié)果:


柵欄函數(shù)(異步)

我們第一個問題得出結(jié)論是:柵欄函數(shù)dispatch_barrier_async確實可以阻塞后面的代碼扰柠,但是這里發(fā)現(xiàn) 這個 33333333 還是先被打印了出來疼约,才執(zhí)行的柵欄函數(shù)。也就是說:柵欄函數(shù)阻塞的是子線程的代碼裆装,主線程的代碼并沒有阻塞。當(dāng)然茎活,這也體現(xiàn)出了 async 異步的特點(diǎn)琢唾。那我們在看看 sync 有什么不一樣的。

NSLog(@"dispatch_barrier_sync");
NSLog(@"---------- 1111111111 ----------");

dispatch_queue_t queue = dispatch_queue_create("com.test.queue", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{
    NSLog(@"開始任務(wù)A采桃,來自線程:%@",[NSThread currentThread]);
    [NSThread sleepForTimeInterval:3];
    NSLog(@"結(jié)束任務(wù)A普办,來自線程:%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
    NSLog(@"開始任務(wù)B,來自線程:%@",[NSThread currentThread]);
    [NSThread sleepForTimeInterval:2];
    NSLog(@"結(jié)束任務(wù)B衔蹲,來自線程:%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
    NSLog(@"開始任務(wù)C,來自線程:%@",[NSThread currentThread]);
    [NSThread sleepForTimeInterval:1];
    NSLog(@"結(jié)束任務(wù)C橱健,來自線程:%@",[NSThread currentThread]);
});
NSLog(@"---------- 2222222222 ----------");
// 柵欄函數(shù)(同步)
dispatch_barrier_sync(queue, ^{
    NSLog(@"----------> barrier <----------");
});

dispatch_async(queue, ^{
    NSLog(@"開始任務(wù)D沙廉,來自線程:%@",[NSThread currentThread]);
});
NSLog(@"---------- 3333333333 ----------");

打印出的結(jié)果:確實分割了前后執(zhí)行的任務(wù)


柵欄函數(shù)(同步)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撬陵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蟋定,更是在濱河造成了極大的恐慌垢夹,老刑警劉巖维费,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異而晒,居然都是意外死亡阅畴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門监署,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人栖秕,你說我怎么就攤上這事晓避。” “怎么了俏拱?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵锅必,是天一觀的道長。 經(jīng)常有香客問我况毅,道長,這世上最難降的妖魔是什么么鹤? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任味廊,我火速辦了婚禮,結(jié)果婚禮上柠新,老公的妹妹穿的比我還像新娘辉巡。我一直安慰自己,他們只是感情好郊楣,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布净蚤。 她就那樣靜靜地躺著,像睡著了一般程梦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屿附,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天拿撩,我揣著相機(jī)與錄音,去河邊找鬼压恒。 笑死,一個胖子當(dāng)著我的面吹牛型宙,可吹牛的內(nèi)容都是我干的伦吠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼搁嗓,長吁一口氣:“原來是場噩夢啊……” “哼箱靴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起衡怀,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抛杨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后怖现,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潘拨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年战秋,在試婚紗的時候發(fā)現(xiàn)自己被綠了讨韭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡狰闪,死狀恐怖濒生,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罪治,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布雁社,位于F島的核電站晒骇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏徒坡。R本人自食惡果不足惜瘤缩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望款咖。 院中可真熱鬧,春花似錦海洼、人聲如沸富腊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽民假。三九已至,卻和暖如春羊异,著一層夾襖步出監(jiān)牢的瞬間彤断,已是汗流浹背易迹。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留睹欲,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓袋哼,卻偏偏與公主長得像闸衫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子楚堤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

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

  • 1. 創(chuàng)建隊列 //自己創(chuàng)建串行隊列 dispatch_queue_t dySerial = dispatch_q...
    哈豊瑪奧閱讀 605評論 0 0
  • 引言: 越是細(xì)節(jié)越能體現(xiàn)一個人的嚴(yán)謹(jǐn)衅胀,越是微小越是能看到事物的光芒 1. 隊列 官方解釋:DispathQueue...
    Chendy_Linda閱讀 2,507評論 2 10
  • 一酥筝、GCD簡介 iOS開發(fā)中多線程的API主要有pthread,NSThread掸掏,NSOperation和GC...
    shuaikun閱讀 136評論 0 1
  • 1.GCD簡介 Grand Central Dispatch(GCD)是 Apple 開發(fā)的一個多核編程的較新的解...
    冰鎮(zhèn)西瓜_5089閱讀 435評論 0 1
  • 表情是什么丧凤,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達(dá)很多信息愿待。高興了當(dāng)然就笑了靴患,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,278評論 2 7