Swift 3 中的 GCD

一、GCD簡介

Grand Central Dispatch(宏偉的中心調(diào)度隊(duì)列楚堤,不知道這樣翻譯對(duì)不對(duì)),它是蘋果為多核的并行運(yùn)算提出的解決方案,所以會(huì)自動(dòng)合理地利用更多的 CPU 內(nèi)核(比如雙核及老、四核)抽莱,最重要的是它會(huì)自動(dòng)管理線程的生命周期(創(chuàng)建線程、調(diào)度任務(wù)骄恶、銷毀線程)食铐,完全不需要我們管理,我們只需要告訴干什么就行叠蝇。同時(shí)它使用的也是C語言璃岳,不過由于使用了閉包,使得使用起來更加方便悔捶、靈活铃慷。在 Swift 3 中,蘋果對(duì) GCD 做了大量改變蜕该,使其更加面向?qū)ο罄绻瘢牡拿婺咳橇耍员疚闹攸c(diǎn)在 Swift3 中的 GCD堂淡。

二馋缅、任務(wù)和隊(duì)列

GCD中有2個(gè)核心概念:任務(wù)隊(duì)列

  1. 任務(wù):執(zhí)行什么操作
    在 GCD 中就是一個(gè) Block绢淀,所以添加任務(wù)十分方便萤悴。任務(wù)有兩種執(zhí)行方式: 同步執(zhí)行異步執(zhí)行,他們之間的區(qū)別是是否會(huì)創(chuàng)建新的線程皆的。
    同步(sync):會(huì)阻塞當(dāng)前線程覆履,直到 Block 中的任務(wù)執(zhí)行完畢!注意這里這里是指阻塞當(dāng)前線程费薄,如果是阻塞子線程硝全,界面并不會(huì)卡住,因?yàn)閁I更新都在主線程楞抡;
    異步(async) :當(dāng)前線程會(huì)直接往下執(zhí)行伟众,它不會(huì)阻塞當(dāng)前線程。
    注意:同步(sync)一定不會(huì)開啟新線程召廷,異步(async) 可能會(huì)開啟新線程凳厢。

  2. 隊(duì)列:用來存放任務(wù)
    串行隊(duì)列:放到串行隊(duì)列的任務(wù),GCD 會(huì) FIFO(先進(jìn)先出)地取出來一個(gè)柱恤,執(zhí)行一個(gè)数初,然后取下一個(gè),這樣一個(gè)一個(gè)的執(zhí)行梗顺。
    并行隊(duì)列:放到并行隊(duì)列的任務(wù)泡孩,GCD 也會(huì) FIFO 的取出來,但不同的是寺谤,它取出來一個(gè)就會(huì)放到別的線程仑鸥,然后再取出來另一個(gè)吮播,放到另一個(gè)的線程。這樣由于取的動(dòng)作很快眼俊,忽略不計(jì)意狠,看起來,所有的任務(wù)都是一起執(zhí)行的疮胖,實(shí)際上环戈,一個(gè) CPU(單核),在一個(gè)時(shí)間點(diǎn)澎灸,只能開啟一個(gè)線程院塞,并行是說 CPU 在多個(gè)線程之間快速來回切換,看上去像多個(gè)線程一起在執(zhí)行性昭。只有多核 CPU 才能真正意義上的并行拦止。
    注意:雖然 GCD 遵循 FIFO 的順序,但在并行時(shí)糜颠,哪一條線程先執(zhí)行完畢是不確定的汹族。例如:A 隊(duì)列第一個(gè)加入任務(wù),B 隊(duì)列第二個(gè)加入任務(wù)其兴,GCD 一定是先取出A隊(duì)列顶瞒,后取出B隊(duì)列。但有可能是 B 隊(duì)列先執(zhí)行完元旬,A 隊(duì)列后執(zhí)行完搁拙,這樣就會(huì)看到先輸出 B,后輸出 A法绵。

同步執(zhí)行 異步執(zhí)行
串行隊(duì)列 當(dāng)前線程,一個(gè)一個(gè)執(zhí)行 另開一條線程酪碘,一個(gè)一個(gè)執(zhí)行
并行隊(duì)列 當(dāng)前線程朋譬,一個(gè)一個(gè)執(zhí)行 開很多線程,一起執(zhí)行

注意:不能獲取同步主隊(duì)列

三兴垦、基本使用

  1. 全局異步隊(duì)列
DispatchQueue.global().async {
        //耗時(shí)操作
}
  1. 主隊(duì)列
DispatchQueue.main.async {
        //刷新UI
}
  1. 延遲操作
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) {
        // 2秒后執(zhí)行
}
  1. 隊(duì)列組
    隊(duì)列組就是把任務(wù)放在DispatchGroup中(入組)徙赢,當(dāng)任務(wù)執(zhí)行完畢時(shí)(出組),即當(dāng)DispatchGroup中沒有任務(wù)時(shí)探越,調(diào)用監(jiān)聽方法notify狡赐,注意:入組和出組一定要成對(duì)出現(xiàn),有幾個(gè)入組钦幔,就一定需要有幾個(gè)出組枕屉。
// 創(chuàng)建一個(gè)隊(duì)列組
let group = DispatchGroup()  
// A任務(wù)入組
group.enter()
// A任務(wù)異步操作
DispatchQueue.global().async(group: group, execute: DispatchWorkItem(block: {
        sleep(2)
        print("download task A ...")
        // 出組
        group.leave()
}))
// B任務(wù)入組
group.enter()
// B任務(wù)異步操作
DispatchQueue.global().async(group: group, execute: DispatchWorkItem(block: {
        sleep(2)
        print("download task B ...")
        // 出組
        group.leave()
}))
// 主線程監(jiān)聽,只有當(dāng)隊(duì)列組中沒有任務(wù)鲤氢,才會(huì)執(zhí)行閉包搀擂。如果多次調(diào)用該方法西潘,每次都會(huì)去檢查隊(duì)列組中是否有任務(wù),如果沒有任務(wù)才執(zhí)行
group.notify(queue: DispatchQueue.main) { 
        print("complete!")
}

運(yùn)行程序哨颂,打印如下:



因?yàn)?task A 和 task B 是加在全局隊(duì)列中喷市,所以它們的執(zhí)行順序由系統(tǒng)決定。但 complete 一定是在兩個(gè)任務(wù)完成后才執(zhí)行威恼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末品姓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子箫措,更是在濱河造成了極大的恐慌腹备,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒂破,死亡現(xiàn)場離奇詭異馏谨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)附迷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門惧互,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喇伯,你說我怎么就攤上這事喊儡。” “怎么了稻据?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵艾猜,是天一觀的道長。 經(jīng)常有香客問我捻悯,道長匆赃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任今缚,我火速辦了婚禮算柳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姓言。我一直安慰自己瞬项,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布何荚。 她就那樣靜靜地躺著囱淋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪餐塘。 梳的紋絲不亂的頭發(fā)上妥衣,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼称鳞。 笑死涮较,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冈止。 我是一名探鬼主播狂票,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼熙暴!你這毒婦竟也來了闺属?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤周霉,失蹤者是張志新(化名)和其女友劉穎掂器,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俱箱,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡国瓮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狞谱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乃摹。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖跟衅,靈堂內(nèi)的尸體忽然破棺而出孵睬,到底是詐尸還是另有隱情,我是刑警寧澤伶跷,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布掰读,位于F島的核電站,受9級(jí)特大地震影響叭莫,放射性物質(zhì)發(fā)生泄漏蹈集。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一雇初、第九天 我趴在偏房一處隱蔽的房頂上張望雾狈。 院中可真熱鬧,春花似錦抵皱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悼院,卻和暖如春伤为,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工绞愚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叙甸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓位衩,卻偏偏與公主長得像裆蒸,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子糖驴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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