Swift3 GCD

Swift3 的gcd變化很大碟联,這里列舉一下芥驳,大家可以有個(gè)對(duì)照:

1码撰、Create a serial queue 創(chuàng)建一個(gè)serial queue

OC

dispatch_queue_t queue = dispatch_queue_create("com.leacode.gcd.serialqueue", DISPATCH_QUEUE_SERIAL); dispatch_async(queue, ^{
    // 在queue線程執(zhí)行
    dispatch_async(dispatch_get_main_queue(), ^{
        // 回到主線程
    });
});

Swift3

let queue = DispatchQueue(label: "com.leacode.gcd.serialqueue")
    queue.async {
        // 在queue線程執(zhí)行
        DispatchQueue.main.async {
            // 回到主線程
        }

 }

2、Create a concurrent queue 創(chuàng)建一個(gè)concurrent queue

OC

dispatch_queue_t concurrentQueue = dispatch_queue_create("com.leacode.gcd.concurrentqueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(concurrentQueue, ^{
        // 在queue線程執(zhí)行
        dispatch_async(dispatch_get_main_queue(), ^{
            // 回到主線程
        });
    });

Swift3

let queue = DispatchQueue(label: "com.leacode.gcd.concurrentqueue", attributes: [.concurrent])
    queue.async {
        // 在queue線程執(zhí)行
        DispatchQueue.main.async {
            // 回到主線程
        }
}

3.系統(tǒng)提供的Concurrent Dispatch Queue:

從ios8開(kāi)始蘋(píng)果引入了一個(gè)新的概念 QoS(quality of service)饱亮,有了更貼近使用場(chǎng)景的描述以及更細(xì)致的劃分矾芙,代碼如下
OC

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
        dispatch_queue_attr_t globalDispatchQueueBackground = dispatch_queue_attr_make_with_qos_class(nil, QOS_CLASS_BACKGROUND, 0);
        dispatch_queue_attr_t globalDispatchQueueUtility = dispatch_queue_attr_make_with_qos_class(nil, QOS_CLASS_UTILITY, 0);
        dispatch_queue_attr_t globalDispatchQueueDefault = dispatch_queue_attr_make_with_qos_class(nil, QOS_CLASS_DEFAULT, 0);
        dispatch_queue_attr_t globalDispatchQueueUserInitiated = dispatch_queue_attr_make_with_qos_class(nil, QOS_CLASS_USER_INITIATED, 0);
        dispatch_queue_attr_t globalDispatchQueueUserInteractive = dispatch_queue_attr_make_with_qos_class(nil, QOS_CLASS_USER_INTERACTIVE, 0);
        dispatch_queue_attr_t globalDispatchQueueUnspecified = dispatch_queue_attr_make_with_qos_class(nil, QOS_CLASS_UNSPECIFIED, 0);
    } else {
        dispatch_queue_t globalDispatchQueueHigh =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
        dispatch_queue_t globalDispatchQueueDefault =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_queue_t globalDispatchQueueLow =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
        dispatch_queue_t globalDispatchQueueBackground =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
}

Swift3

if #available(iOS 8.0, *) {
            let globalDispatchQueueBackground = DispatchQueue.global(qos: DispatchQoS.QoSClass.background)
            let globalDispatchQueueUtility = DispatchQueue.global(qos: DispatchQoS.QoSClass.utility)
            let globalDispatchQueueDefault = DispatchQueue.global(qos: DispatchQoS.QoSClass.default)
            let globalDispatchQueueUserInitiated = DispatchQueue.global(qos: DispatchQoS.QoSClass.userInteractive)
            let globalDispatchQueueUserInteractive = DispatchQueue.global(qos: DispatchQoS.QoSClass.userInteractive)
            let globalDispatchQueueUnspecified = DispatchQueue.global(qos: DispatchQoS.QoSClass.unspecified)
        } else {
            let globalDispatchQueueBackground = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.background)
            let globalDispatchQueueLow = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.low)
            let globalDispatchQueueDefault = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default)
            let globalDispatchQueueHigh = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.high)
 }

4.dispatch_after

這部分Swift3的變化較大
OC

dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull * NSEC_PER_SEC);
dispatch_after(time, dispatch_get_main_queue(), ^{
    NSLog(@"%@", @"3秒后執(zhí)行");
});

Swift3

let time = DispatchTime.now() + 3
DispatchQueue.main.asyncAfter(deadline: time) { 
    // 3秒后執(zhí)行
    print("3秒后執(zhí)行")
}
 DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 6) {
       // 6秒后執(zhí)行2
       print("6秒后執(zhí)行")
}

5.掛起和恢復(fù)

OC

dispatch_suspend(queue);
dispatch_resume(queue);

Swift3

queue.suspend()
queue.resume()

6.判斷間隔一段時(shí)間group是否執(zhí)行結(jié)束

OC

dispatch_queue_t queue1 = dispatch_queue_create("com.leacode.gcd.queue1", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t queue2 = dispatch_queue_create("com.leacode.gcd.queue2", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t queue3 = dispatch_queue_create("com.leacode.gcd.queue3", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t queue4 = dispatch_queue_create("com.leacode.gcd.queue4", DISPATCH_QUEUE_SERIAL);

dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue1, ^{

});
dispatch_group_async(group, queue2, ^{

});
dispatch_group_async(group, queue3, ^{

});
dispatch_group_async(group, queue4, ^{

});

dispatch_time_t group_time = dispatch_time(DISPATCH_TIME_NOW, 1ull*NSEC_PER_SEC);
long result = dispatch_group_wait(group, group_time);
if (result == 0) {
    /*
     * 屬于Dispatch Group的全部處理執(zhí)行結(jié)束
     */
} else {
    /*
     * 屬于Dispatch Group的某一個(gè)處理還在進(jìn)行中
     */
}

dispatch_group_notify(group, dispatch_get_main_queue(), ^{

});

Swift3

let queue1 = DispatchQueue(label: "com.leacode.group.queue1")
let queue2 = DispatchQueue(label: "com.leacode.group.queue2")
let queue3 = DispatchQueue(label: "com.leacode.group.queue3")
let group = DispatchGroup()

queue1.async(group: group) {

}
queue2.async(group: group) {

}
queue3.async(group: group) {

 }

/*
* 以下代碼可以判斷間隔時(shí)間為1秒后group是否執(zhí)行完畢,并執(zhí)行相應(yīng)的處理
*/
let afterTime = DispatchTime.now() + 1
let result = group.wait(timeout: afterTime)

if result == .success {
      /*
       * 屬于Dispatch Group的全部處理執(zhí)行結(jié)束
       */
    } else {
        /*
         * 屬于Dispatch Group的某一個(gè)處理還在進(jìn)行中
         */
    }

    group.notify(queue: DispatchQueue.main) {

    }

7.dispatch_once

這里我們用單例來(lái)舉例近上,oc和swift中都是通過(guò)創(chuàng)建一個(gè)static對(duì)象來(lái)創(chuàng)建單例子剔宪,在swift3中只需要寫(xiě)一個(gè)static變量就可以了:
OC

+ (id)sharedInstance
{
    static MyClass *myclass = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        myclass = [[self alloc] init];
    });
    return myclass;
}

Swift

class MyClass {
    static let singleton = MyClass()
    private init() {
        print("foo")
    }
}

在swift中已經(jīng)取消掉dispatch_once了,可以看蘋(píng)果的說(shuō)明鏈接

The free function dispatch_once
is no longer available in Swift. In Swift, you can use lazily initialized globals or static properties and get the same thread-safety and called-once guarantees as dispatch_once
provided

可以通過(guò)設(shè)置懶加載的全局屬性或者靜態(tài)屬性來(lái)達(dá)到線程安全且執(zhí)行一次的效果壹无。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末葱绒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子斗锭,更是在濱河造成了極大的恐慌地淀,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岖是,死亡現(xiàn)場(chǎng)離奇詭異帮毁,居然都是意外死亡实苞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)烈疚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)黔牵,“玉大人,你說(shuō)我怎么就攤上這事胞得。” “怎么了屹电?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵阶剑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我危号,道長(zhǎng)牧愁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任外莲,我火速辦了婚禮猪半,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘偷线。我一直安慰自己磨确,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布声邦。 她就那樣靜靜地躺著乏奥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亥曹。 梳的紋絲不亂的頭發(fā)上邓了,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音媳瞪,去河邊找鬼骗炉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蛇受,可吹牛的內(nèi)容都是我干的句葵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼兢仰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼笼呆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起旨别,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诗赌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后秸弛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體铭若,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洪碳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叼屠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞳腌。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖镜雨,靈堂內(nèi)的尸體忽然破棺而出嫂侍,到底是詐尸還是另有隱情,我是刑警寧澤荚坞,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布挑宠,位于F島的核電站,受9級(jí)特大地震影響颓影,放射性物質(zhì)發(fā)生泄漏各淀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一诡挂、第九天 我趴在偏房一處隱蔽的房頂上張望碎浇。 院中可真熱鬧,春花似錦璃俗、人聲如沸奴璃。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)溺健。三九已至,卻和暖如春钮蛛,著一層夾襖步出監(jiān)牢的瞬間鞭缭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工魏颓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岭辣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓甸饱,卻偏偏與公主長(zhǎng)得像沦童,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叹话,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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