GCD的簡單學(xué)習(xí)與使用

GCD 就是蘋果給我們封裝好的異步執(zhí)行的代碼~

蘋果官方對GCD的說明:開發(fā)者只需要定義想執(zhí)行的任務(wù)并追加到適當(dāng)?shù)腄ispatch Queue中。

dispatch_async(queue, ^{
        //想要做的事
    })

Dispatch Queue 就是執(zhí)行處理的等待隊列洽故,按照FIFO先進先出的順序執(zhí)行

并且Dispatch Queue還分為兩種:

  • Serial Dispatch Queue 即只使用單線程,執(zhí)行完成的順序和執(zhí)行順序一致---串行隊列
  • Concurrent Dispatch Queue 多個線程一起執(zhí)行杀餐。執(zhí)行完成的順序和執(zhí)行順序不一致---并行隊列

創(chuàng)建隊列:

  • 串行隊列:

dispatch_queue_t serialQueue = dispatch_queue_create
("info.byhuang.SerialQueue", DISPATCH_QUEUE_SERIAL);
//可以是使用NULL代替DISPATCH_QUEUE_SERIAL 詳情可以看這個宏的定義


* 并行隊列:

* ```
dispatch_queue_t concurrentQueue = dispatch_queue_create
("info.byhuang.ConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);

創(chuàng)建出來的是不是串行或并行裙盾,大家可以自己測試一下即可

當(dāng)然系統(tǒng)也為我們提供了幾個不同優(yōu)先級的并行隊列,讓我們可以快速使用:

    //優(yōu)先級最高隊列- 并行
    dispatch_queue_t globalHighQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    //默認優(yōu)先級
    dispatch_queue_t globalDefaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    //低優(yōu)先級
    dispatch_queue_t globalLowQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
    
    //后臺運行
    dispatch_queue_t globalBackgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

在前面我們自己創(chuàng)建的隊列也是有優(yōu)先級的郎任,它的默認優(yōu)先級是default 秧耗,如果

我們想要修改它的優(yōu)先級就需要使用<b>target_queue</b>

    //自定義一個隊列
    dispatch_queue_t highQueue = dispatch_queue_create("info.byhuang.highQueue", DISPATCH_QUEUE_CONCURRENT);
    
    //變更隊列的優(yōu)先級
    dispatch_set_target_queue(highQueue, globalHighQueue);

如果我們需要在固定的時間之后把某個操作假如到隊列中怎么辦呢?沒關(guān)系已經(jīng)有現(xiàn)成的可以用啦~~ dispatch_after舶治,就可以幫你解決!

//ull是c語言的數(shù)值字面量
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC*3ull);

dispatch_after(time, highQueue, ^{
        NSLog(@"Hi byhuang ");
    });

但是要注意dispatch_after>不是在指定事件執(zhí)行而是在指定時間之后加入到隊列中分井,所以等待時間會大雨等于time。因為有可能隊列中任務(wù)有很多啊霉猛,我們在三秒中之后只是加入到隊列中尺锚,還沒有算等待的時間呢;

需要在隊列中任務(wù)執(zhí)行完之后再執(zhí)行某個任務(wù)的時候就要用到dispatch_group

dispatch_group_t group = dispatch_group_create();
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"全部執(zhí)行完了");
    });

    //需要配合 dispatch_group_async使用加入到group中
    dispatch_group_async(group, highQueue, ^{
        NSLog(@"111zz");
    });

group中可以包含有不同隊列中的任務(wù)。只有把任務(wù)加入到group中惜浅。當(dāng)任務(wù)執(zhí)行完就會調(diào)用dispatch_group_notify來執(zhí)行我們所追加的任務(wù)了瘫辩,怎么樣是不是很簡單~

還有一種當(dāng)單個隊列中任務(wù)執(zhí)行完成之后再執(zhí)行某個任務(wù)的方法dispatch_barrier_async

 //使用dispatch_barrier_async用來在并行隊列都執(zhí)行完之后,再執(zhí)行的操作.
    dispatch_barrier_async(concurrentQueue, ^{
        //全部執(zhí)行完再執(zhí)行
        NSLog(@"2");
    });

dispatch_sync:同步執(zhí)行坛悉,不執(zhí)行完不會返回返回結(jié)果杭朱。極其容易造成死鎖吹散,所以我們盡量避免使用弧械,尤其是在主線程中!

dispatch_apply:根據(jù)次數(shù)來向主線程中添加幾次操作空民。

dispatch_suspend:掛起指定的線程

dispatch_resume:恢復(fù)指定的線程

//同步的--在主線程中千萬不要使用刃唐,否則會造成卡死
    dispatch_sync(concurrentQueue, ^{
        NSLog(@"byhuang");
    });

    //根據(jù)次數(shù)來指定羞迷,向隊列中添加幾次操作
    dispatch_apply(3, concurrentQueue, ^(size_t index) {
        NSLog(@"添加三次");
    });
   //指定掛起的隊列
    dispatch_suspend(concurrentQueue);
    
    //恢復(fù)指定的隊列
    dispatch_resume(concurrentQueue);

我想上面這些操作已經(jīng)足夠我們的平常使用,最后一起學(xué)習(xí)共勉~

我的個人博客地址byhuang的技術(shù)博客

和簡書一起同步更新~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末画饥,一起剝皮案震驚了整個濱河市衔瓮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抖甘,老刑警劉巖热鞍,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衔彻,居然都是意外死亡薇宠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門艰额,熙熙樓的掌柜王于貴愁眉苦臉地迎上來澄港,“玉大人,你說我怎么就攤上這事柄沮』匚啵” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵祖搓,是天一觀的道長狱意。 經(jīng)常有香客問我,道長拯欧,這世上最難降的妖魔是什么详囤? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮哈扮,結(jié)果婚禮上纬纪,老公的妹妹穿的比我還像新娘。我一直安慰自己滑肉,他們只是感情好包各,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著靶庙,像睡著了一般问畅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上六荒,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天护姆,我揣著相機與錄音,去河邊找鬼掏击。 笑死卵皂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砚亭。 我是一名探鬼主播灯变,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼殴玛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了添祸?” 一聲冷哼從身側(cè)響起滚粟,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刃泌,沒想到半個月后凡壤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡耙替,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年亚侠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片林艘。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡盖奈,死狀恐怖混坞,靈堂內(nèi)的尸體忽然破棺而出狐援,到底是詐尸還是另有隱情,我是刑警寧澤究孕,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布啥酱,位于F島的核電站,受9級特大地震影響厨诸,放射性物質(zhì)發(fā)生泄漏镶殷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一微酬、第九天 我趴在偏房一處隱蔽的房頂上張望绘趋。 院中可真熱鬧,春花似錦颗管、人聲如沸陷遮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帽馋。三九已至,卻和暖如春比吭,著一層夾襖步出監(jiān)牢的瞬間绽族,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工衩藤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吧慢,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓赏表,卻偏偏與公主長得像检诗,于是被迫代替她去往敵國和親怖喻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

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

  • 本篇博客共分以下幾個模塊來介紹GCD的相關(guān)內(nèi)容: 多線程相關(guān)概念 多線程編程技術(shù)的優(yōu)缺點比較岁诉? GCD中的三種隊列...
    dullgrass閱讀 37,863評論 30 236
  • iOS中GCD的使用小結(jié) 作者dullgrass 2015.11.20 09:41*字數(shù) 4996閱讀 20199...
    DanDanC閱讀 842評論 0 0
  • 本篇博客共分以下幾個模塊來介紹GCD的相關(guān)內(nèi)容: 多線程相關(guān)概念 多線程編程技術(shù)的優(yōu)缺點比較锚沸? GCD中的三種隊列...
    有夢想的老伯伯閱讀 1,020評論 0 4
  • 簡介 GCD(Grand Central Dispatch)是在macOS10.6提出來的,后來在iOS4.0被引...
    sunmumu1222閱讀 868評論 0 2
  • 最近《最好的我們》熱播涕癣,劇評普遍高哗蜈。人們常說,時間是療傷的神藥坠韩,可最終還是沒醫(yī)好耿耿死心塌地的愛著余淮距潘。陸星河1...
    愛鍛煉的貓小二閱讀 393評論 0 0