Swift4:GCD的使用

測(cè)試環(huán)境:Xcode9武福,Swift4

一.創(chuàng)建一個(gè)DispatchQueue噩翠,并為你的隊(duì)列提供一個(gè)label兔辅。建議使用反向DNS符號(hào)("com.cn.xxx")

let queue = DispatchQueue(label: "com.cn.zcy.queue")

二.串行隊(duì)列
創(chuàng)建一個(gè)串行隊(duì)列并在viewDidLoad中執(zhí)行
1.同步執(zhí)行

func execQueues() {
        let queue = DispatchQueue(label: "com.cn.zcy.queue")
        queue.sync {
            for i in 0..<10 {
                print("----", i)
            }
        }
        for i in 10..<20 {
            print("==", i)
        }
    }
結(jié)果1.png

執(zhí)行結(jié)果如圖所示数初。因?yàn)槭峭綀?zhí)行鹤啡,所以會(huì)先執(zhí)行第一個(gè)for循環(huán)肌稻,執(zhí)行完成后才會(huì)執(zhí)行第二個(gè)for循環(huán)清蚀。
2.異步執(zhí)行
修改一下代碼,改成異步執(zhí)行for循環(huán)

func execQueues() {
        let queue = DispatchQueue(label: "com.cn.zcy.queue")
        queue.async {
            for i in 0..<10 {
                print("----", i)
            }
        }
        for i in 10..<20 {
            print("==", i)
        }
    }
結(jié)果2.png

執(zhí)行結(jié)果如圖所示爹谭。因?yàn)槭钱惒綀?zhí)行枷邪,程序不會(huì)等待queue隊(duì)列的任務(wù)執(zhí)行完成,會(huì)直接回到主線程執(zhí)行第二個(gè)for循環(huán)诺凡,兩個(gè)循環(huán)同時(shí)進(jìn)行齿风。

三.Quality Of Service(QoS)
用于指定任務(wù)優(yōu)先級(jí),在 GCD 中被稱為 Quality of Service(QoS)绑洛。如果沒(méi)有指定 QoS救斑,則隊(duì)列會(huì)使用默認(rèn)優(yōu)先級(jí)進(jìn)行初始化。以下列表從高到低列出了各個(gè)優(yōu)先級(jí):
userInteractive
userInitiated
default
utility
background
unspecified

為了測(cè)試優(yōu)先級(jí)真屯,我們創(chuàng)建兩個(gè)queue脸候,并將優(yōu)先級(jí)設(shè)置為相同級(jí)別

let queue1 = DispatchQueue(label: "com.cn.zcy.queue1", qos: DispatchQoS.userInitiated)
        let queue2 = DispatchQueue(label: "com.cn.zcy.queue2", qos: DispatchQoS.userInitiated)

queue1.async {
            for i in 0..<10 {
                print("----", i)
            }
        }
        queue2.async {
            for i in 10..<20 {
                print("==", i)
            }
        }
結(jié)果3.png

執(zhí)行結(jié)果如圖所示。因?yàn)閮?yōu)先級(jí)相同,又是異步執(zhí)行运沦,所以兩個(gè)任務(wù)被“均勻”的執(zhí)行泵额。

下面我們改變其中一個(gè)的優(yōu)先級(jí),將queue1優(yōu)先級(jí)提高

let queue1 = DispatchQueue(label: "com.cn.zcy.queue1", qos: DispatchQoS.userInteractive)
結(jié)果4.png

執(zhí)行結(jié)果如圖所示携添。兩個(gè)任務(wù)都獲得了執(zhí)行的機(jī)會(huì)嫁盲,但是queue1優(yōu)先級(jí)高,會(huì)優(yōu)先執(zhí)行烈掠。

現(xiàn)在羞秤,我們可以在主隊(duì)列中也執(zhí)行一個(gè)for循環(huán),來(lái)測(cè)試3個(gè)for循環(huán)的優(yōu)先級(jí)

func execQueues() {

        let queue1 = DispatchQueue(label: "com.cn.zcy.queue1", qos: DispatchQoS.userInitiated)
        let queue2 = DispatchQueue(label: "com.cn.zcy.queue2", qos: DispatchQoS.default)
        queue1.async {
            for i in 0..<10 {
                print("----", i)
            }
        }
        queue2.async {
            for i in 10..<20 {
                print("==", i)
            }
        }
        for i in 100..<110 {
            print("~~~~~", i)
        }
    }
結(jié)果5.png

執(zhí)行結(jié)果如圖所示左敌●埃可以看出,主隊(duì)列最先執(zhí)行完矫限,擁有最高的優(yōu)先級(jí)哺哼。

四.并行隊(duì)列
創(chuàng)建一個(gè)并行的隊(duì)列,并加入3個(gè)任務(wù)叼风,每個(gè)任務(wù)執(zhí)行一個(gè)for循環(huán)取董,查看結(jié)果。創(chuàng)建并發(fā)隊(duì)列需要新的參數(shù)attributes无宿,并且需要設(shè)定為DispatchQueue.Attributes.concurrent

func concurrentQueue() {
        let concQueue = DispatchQueue(label: "com.cn.zcy.concurrent", qos: DispatchQoS.default, attributes: DispatchQueue.Attributes.concurrent)

        concQueue.async {
            for i in 0..<10 {
                print("----", i)
            }
        }
        concQueue.async {
            for i in 10..<20 {
                print("==", i)
            }
        }
        concQueue.async {
            for i in 100..<110 {
                print("~~~~", i)
            }
        }
    }
結(jié)果6.png

執(zhí)行結(jié)果如圖所示甲葬。

attributes屬性也可以接受另一個(gè)值:initiallyInactive。如果使用這個(gè)值懈贺,任務(wù)不會(huì)被自動(dòng)執(zhí)行经窖,而是需要開發(fā)者手動(dòng)去觸發(fā)。
創(chuàng)建一個(gè)成員變量

var inactiveQueue: DispatchQueue!

在concQueue創(chuàng)建后賦值給inactiveQueue梭灿,并修改concQueue創(chuàng)建參數(shù)

let concQueue = DispatchQueue(label: "com.cn.zcy.concurrent", qos: DispatchQoS.default, attributes: [DispatchQueue.Attributes.concurrent, DispatchQueue.Attributes.initiallyInactive])

此時(shí)如果直接運(yùn)行并不會(huì)打印任何信息画侣。
在調(diào)用了concurrentQueue()方法后還要手動(dòng)運(yùn)行:

if let queue = inactiveQueue {
            queue.activate()
        }

此時(shí)會(huì)打印出信息,打印結(jié)果同上圖類似堡妒。

五.延遲執(zhí)行
創(chuàng)建一個(gè)隊(duì)列配乱,并在加入任務(wù)時(shí)延遲執(zhí)行。

func delayQueue() {
        let delayQueue = DispatchQueue(label: "com.cn.delayQUeue")
        print(Date())
        delayQueue.asyncAfter(deadline: DispatchTime.now() + 2) {
            print(Date())
        }
    }
結(jié)果7.png

執(zhí)行結(jié)果如圖所示皮迟。打印的日期之間相差了2秒搬泥。

六.主隊(duì)列與全局隊(duì)列
獲取主隊(duì)列:

let mainQueue = DispatchQueue.main

獲取全局隊(duì)列

let globalQueue = DispatchQueue.global()

使用方法同上

七. DispatchWorkItem
DispatchWorkItem 是一個(gè)代碼塊,它可以在任意一個(gè)隊(duì)列上被調(diào)用伏尼。
下面我們看看如何使用:


func useWorkItem() {
        var value = 1
        
        let workItem = DispatchWorkItem {
            value += 1
        }
        
        let globalQueue = DispatchQueue.global()
        globalQueue.async {
            workItem.perform()
        }
        
        workItem.notify(queue: DispatchQueue.main) {
            print(value)
        }
    }

這個(gè)workItem的作用是讓value+1忿檩,通過(guò)workItem的perform()方法來(lái)執(zhí)行代碼塊,執(zhí)行完成后可以通知主隊(duì)列爆阶。

剛開始研究Swift燥透,如有錯(cuò)誤和優(yōu)化的地方沙咏,望不吝賜教。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末班套,一起剝皮案震驚了整個(gè)濱河市肢藐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吱韭,老刑警劉巖吆豹,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異理盆,居然都是意外死亡痘煤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門熏挎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)速勇,“玉大人晌砾,你說(shuō)我怎么就攤上這事坎拐。” “怎么了养匈?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵哼勇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我呕乎,道長(zhǎng)积担,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任猬仁,我火速辦了婚禮帝璧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘湿刽。我一直安慰自己的烁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布诈闺。 她就那樣靜靜地躺著渴庆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雅镊。 梳的紋絲不亂的頭發(fā)上襟雷,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音仁烹,去河邊找鬼耸弄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卓缰,可吹牛的內(nèi)容都是我干的叙赚。 我是一名探鬼主播老客,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼震叮!你這毒婦竟也來(lái)了瞧哟?” 一聲冷哼從身側(cè)響起屠升,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后逛钻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芋簿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年罢低,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媳禁。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡眠副,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竣稽,到底是詐尸還是另有隱情囱怕,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布毫别,位于F島的核電站娃弓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏岛宦。R本人自食惡果不足惜台丛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砾肺。 院中可真熱鬧挽霉,春花似錦、人聲如沸变汪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疫衩。三九已至硅蹦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闷煤,已是汗流浹背童芹。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鲤拿,地道東北人假褪。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像近顷,于是被迫代替她去往敵國(guó)和親生音。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宁否,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • 一、在后臺(tái)工作量少 當(dāng)用戶沒(méi)有主動(dòng)使用你的應(yīng)用程序時(shí)缀遍,系統(tǒng)會(huì)將其轉(zhuǎn)換為背景狀態(tài)慕匠。該系統(tǒng)最終可能會(huì)暫停您的應(yīng)用程序,...
    弗利撒閱讀 824評(píng)論 1 0
  • 本文由SwiftGG獨(dú)家授權(quán)發(fā)布域醇。 多核處理器是中央處理器(CPU)自出現(xiàn)以來(lái)最大的技術(shù)進(jìn)步台谊,這意味著它可以同時(shí)運(yùn)...
    請(qǐng)叫我小鍋閱讀 2,226評(píng)論 2 3
  • 作者:GABRIEL THEODOROPOULOS,原文鏈接譬挚,原文日期:2016-11-16譯者:小鍋锅铅;校對(duì):sa...
    梁杰_numbbbbb閱讀 3,209評(píng)論 0 7
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)减宣,斷路器盐须,智...
    卡卡羅2017閱讀 134,664評(píng)論 18 139
  • 雖然還有一周的時(shí)間過(guò)七夕,但朋友圈已經(jīng)開始熱鬧起來(lái)了漆腌,賣鮮花的贼邓,蛋糕的,各種代購(gòu)的屉凯。又將是一個(gè)被虐的節(jié)日立帖。于是翻到...
    莫曉之閱讀 397評(píng)論 0 0