GCD代碼小計(jì)

GCD代碼記錄霞扬,以便后用

//自定義一個(gè)queue:
- (void)customQueue{
    /*
     第二個(gè)參數(shù)傳:
     串行隊(duì)列:DISPATCH_QUEUE_SERIAL     開啟一個(gè)子線程页畦,按序執(zhí)行
     并行隊(duì)列:DISPATCH_QUEUE_CONCURRENT 開啟多個(gè)子線程,無序執(zhí)行
     同步:串行秀又、并行都會(huì)在主線程
     異步:串行涮帘、并行都會(huì)在子線程
     */
    
    //串行隊(duì)列
    dispatch_queue_t serialQueue = dispatch_queue_create("com.gcd.serialQueue", DISPATCH_QUEUE_SERIAL);
    //并發(fā)隊(duì)列
    dispatch_queue_t concurrentQueue = dispatch_queue_create("com.gcd.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    
//可以通過dispatch_queue_get_label(dispatch_queue_t queue)獲取你創(chuàng)建queue的名字
    const char *c = dispatch_queue_get_label(concurrentQueue);
    NSLog(@"%s",c);//com.gcd.concurrentQueue

    dispatch_sync(concurrentQueue, ^{
        NSLog(@"1");
        [NSThread sleepForTimeInterval:2];
        NSLog(@"1--");
    });
    dispatch_sync(concurrentQueue, ^{
        NSLog(@"2");
        [NSThread sleepForTimeInterval:2];
        NSLog(@"2--");
    });
    dispatch_sync(concurrentQueue, ^{
        NSLog(@"3");
        [NSThread sleepForTimeInterval:4];
        NSLog(@"3--");
    });
    dispatch_sync(concurrentQueue, ^{
        NSLog(@"4");
        [NSThread sleepForTimeInterval:2];
        NSLog(@"4--");
    });
}

dispatch_group

/*
 串行隊(duì)列:DISPATCH_QUEUE_SERIAL     開啟一個(gè)子線程拼苍,按序執(zhí)行
 并行隊(duì)列:DISPATCH_QUEUE_CONCURRENT 開啟多個(gè)子線程,無序執(zhí)行
 */
- (void)dispatch_group{
    dispatch_queue_t queue = dispatch_queue_create("com.gcd.serialQueue", DISPATCH_QUEUE_SERIAL);
    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, queue, ^{
        NSLog(@"1");
        [NSThread sleepForTimeInterval:5];
        NSLog(@"1--");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"2");
        [NSThread sleepForTimeInterval:8];
        NSLog(@"2--");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"3");
        [NSThread sleepForTimeInterval:3];
        NSLog(@"3--");
    });

    dispatch_group_notify(group, queue, ^{
        NSLog(@"notify:任務(wù)都完成了");
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"回到主線程");
        });
    });
}

dispatch_group_enter和dispatch_group_leave是成對(duì)出現(xiàn)的调缨,可以按照引用計(jì)數(shù)+1疮鲫、-1理解。

/*
 串行隊(duì)列:DISPATCH_QUEUE_SERIAL     開啟一個(gè)子線程弦叶,按序執(zhí)行
 并行隊(duì)列:DISPATCH_QUEUE_CONCURRENT 開啟多個(gè)子線程俊犯,無序執(zhí)行
 注意:dispatch_group_notify會(huì)與耗時(shí)最長(zhǎng)的線程在同一個(gè)線程
 */
- (void)dispatch_group_enter{
    dispatch_queue_t queue = dispatch_queue_create("com.GCD.group", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        sleep(5);
        NSLog(@"任務(wù)一完成");
        dispatch_group_leave(group);
    });
    
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        sleep(8);
        NSLog(@"任務(wù)二完成");
        dispatch_group_leave(group);
    });
    
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        sleep(3);
        NSLog(@"任務(wù)三完成");
        dispatch_group_leave(group);
    });
    
    dispatch_group_notify(group, queue, ^{
        NSLog(@"任務(wù)完成");
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"回到主線程");
        });
    });
}

dispatch_barrier

/*
 dispatch_barrier_sync和dispatch_barrier_async的共同點(diǎn):
 1、都會(huì)等待在它前面插入隊(duì)列的任務(wù)(1湾蔓、2瘫析、3)先執(zhí)行完
 2砌梆、都會(huì)等待他們自己的任務(wù)(0)執(zhí)行完再執(zhí)行后面的任務(wù)(4默责、5贬循、6)
 
 dispatch_barrier_sync和dispatch_barrier_async的不共同點(diǎn):
 在將任務(wù)插入到queue的時(shí)候,dispatch_barrier_sync需要等待自己的任務(wù)(0)結(jié)束之后才會(huì)繼續(xù)程序桃序,然后插入被寫在它后面的任務(wù)(4杖虾、5、6)媒熊,然后執(zhí)行后面的任務(wù)
 而dispatch_barrier_async將自己的任務(wù)(0)插入到queue之后奇适,不會(huì)等待自己的任務(wù)結(jié)束,它會(huì)繼續(xù)把后面的任務(wù)(4芦鳍、5嚷往、6)插入到queue
 */
- (void)dispatch_barrier{
    dispatch_queue_t queue = dispatch_queue_create("com.GCD.barrier", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"1");
        [NSThread sleepForTimeInterval:3];
        NSLog(@"1--");
    });
    dispatch_async(queue, ^{
        NSLog(@"2");
        [NSThread sleepForTimeInterval:5];
        NSLog(@"2--");
    });
    dispatch_async(queue, ^{
        NSLog(@"3");
        [NSThread sleepForTimeInterval:2];
        NSLog(@"3--");
    });
    
    dispatch_barrier_async(queue, ^{
        NSLog(@"barrier");
        [NSThread sleepForTimeInterval:2];
        NSLog(@"barrier--");
        [NSThread sleepForTimeInterval:3];
        NSLog(@"barrier==");
    });
    NSLog(@"aaa");
    dispatch_async(queue, ^{
        NSLog(@"4");
        [NSThread sleepForTimeInterval:3];
        NSLog(@"4--");
    });
    NSLog(@"bbb");
    dispatch_async(queue, ^{
        NSLog(@"5");
        [NSThread sleepForTimeInterval:5];
        NSLog(@"5--");
    });
    dispatch_async(queue, ^{
        NSLog(@"6");
        [NSThread sleepForTimeInterval:2];
        NSLog(@"6--");
    });
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市柠衅,隨后出現(xiàn)的幾起案子皮仁,更是在濱河造成了極大的恐慌,老刑警劉巖菲宴,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贷祈,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡喝峦,警方通過查閱死者的電腦和手機(jī)势誊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谣蠢,“玉大人粟耻,你說我怎么就攤上這事′鲈酰” “怎么了勋颖?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)勋锤。 經(jīng)常有香客問我饭玲,道長(zhǎng),這世上最難降的妖魔是什么叁执? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任茄厘,我火速辦了婚禮,結(jié)果婚禮上谈宛,老公的妹妹穿的比我還像新娘次哈。我一直安慰自己,他們只是感情好吆录,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布窑滞。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哀卫。 梳的紋絲不亂的頭發(fā)上巨坊,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音此改,去河邊找鬼趾撵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛共啃,可吹牛的內(nèi)容都是我干的占调。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼移剪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼究珊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纵苛,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤苦银,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后赶站,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幔虏,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年贝椿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了想括。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烙博,死狀恐怖瑟蜈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情渣窜,我是刑警寧澤铺根,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站乔宿,受9級(jí)特大地震影響位迂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜详瑞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一掂林、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坝橡,春花似錦泻帮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脂倦。三九已至,卻和暖如春元莫,著一層夾襖步出監(jiān)牢的瞬間狼讨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工柒竞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人播聪。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓朽基,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親离陶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稼虎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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

  • 談到iOS多線程,一般都會(huì)談到四種方式:pthread招刨、NSThread霎俩、GCD和NSOperation。其中沉眶,蘋...
    攻城獅GG閱讀 268評(píng)論 0 3
  • 41.多用派發(fā)隊(duì)列,少用同步鎖 在Objective-C中打却,如果有多個(gè)線程要執(zhí)行同一份代碼,那么有時(shí)可能會(huì)出問題谎倔。...
    Code_Ninja閱讀 1,135評(píng)論 1 13
  • 什么是GCD柳击? Grand Central Dispatch(GCD)是蘋果開發(fā)的一項(xiàng)技術(shù),用于提升應(yīng)用在多核處理...
    rapunzelyeah閱讀 265評(píng)論 0 1
  • Dispatch queues Dispatch queue有兩種類型胯府,一種是線性queue褐捻,線性queue一個(gè)一...
    沈冰忱閱讀 751評(píng)論 1 3
  • 棄一座城孽查,放一人在心底饥悴! 你經(jīng)歷過絕望嗎?你是否也曾為一個(gè)人而遠(yuǎn)離一座城盲再,滿含熱淚笑著說再見铺坞。 伴著鐵皮車廂的搖晃...
    罌粟sentry閱讀 183評(píng)論 0 0