Swift_技巧(2)_GCD的使用總結(jié)

OC版本:http://www.lxweimin.com/p/25b59832b302

一丶介紹

目錄:

1.多個網(wǎng)絡(luò)請求并發(fā)處理
2.分線程/主線程通訊
3.延遲執(zhí)行
4.隊列組的使用
5.信號量

官方api

https://developer.apple.com/reference/dispatch

二丶代碼

1.多個網(wǎng)絡(luò)請求并發(fā)處理;
//1.多個網(wǎng)絡(luò)請求并發(fā)處理;
let  dispatchGroup = DispatchGroup.init()
//延遲執(zhí)行
let delay =  DispatchTime.now() + .seconds(1);
print("準(zhǔn)備做第一件事");
dispatchGroup.enter();
DispatchQueue.main.asyncAfter(deadline: delay) {
    
    print("延遲1秒做的事情結(jié)束");
    dispatchGroup.leave();
}
//延遲執(zhí)行
let delay2 =  DispatchTime.now() + .seconds(3);
print("準(zhǔn)備做第二件事");
dispatchGroup.enter();
DispatchQueue.main.asyncAfter(deadline: delay2) {
    
    print("延遲3秒做的事情結(jié)束");
    dispatchGroup.leave();
}

dispatchGroup.notify(queue: DispatchQueue.main) {
    print("全部完成");
}
2分線程/主線程通訊
//2分線程/主線程通訊
DispatchQueue.global().async {
    
    DispatchQueue.main.async {
        
    }
}
3.延遲執(zhí)行
//3延遲執(zhí)行
let delay =  DispatchTime.now() + .seconds(3);
print("開始");
DispatchQueue.main.asyncAfter(deadline: delay) {
    
    print("結(jié)束");
}
4.隊列組的使用
//4,隊列組的使用
let group = DispatchGroup.init();
let queue1 = DispatchQueue.init(label: "Queue")
//組,優(yōu)先級,
queue1.async(group: group, qos: .default, flags: .barrier, execute: {
    for _ in 0...5 {
        print(" Q1____> \(Thread.current)")
    }
})
queue1.async(group: group, qos: .default, flags: .barrier, execute: {
    for _ in 0...3 {
        print(" Q2____> \(Thread.current)")
    }
})

queue1.async(group: group, qos: .default, flags: .barrier, execute: {
    for _ in 0...4 {
        print(" Q3____> \(Thread.current)")
    }
})
group.notify(queue: queue1) {
    
    print(" 完成__> \(Thread.current)")
}
5.信號量
//5信號量
let singnal = DispatchSemaphore.init(value: 1);
//-1
singnal.wait();
//+1
singnal.signal();

例子:
所有線程都必須做一件事情,只要有1個線程做完,其他線程就不用做的情景:

var _count :Int = 0
var _signal: DispatchSemaphore = DispatchSemaphore.init(value: 1)

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    
    /*
     三個線程同時處理xzb()
     */
    _count = 0;
    for var index in 0...3 {
        index += 1
        DispatchQueue.global().async {
            self.xzb(name: "\(index)")
        }
    }
}
//  如果 count < 10 則讓 count 累加且只能有一個線程做,如果有一個線程去做累加,其他線程則等待;
func xzb(name: String) -> () {
    print("準(zhǔn)備開始-->" + name)
    _signal.wait();
    if _count < 10 {
        for _ in 0...10 {
            _count += 1
            print(_count)
        }
    }
    _signal.signal();
    print("結(jié)束")
}

日志:

準(zhǔn)備開始-->1
準(zhǔn)備開始-->4
準(zhǔn)備開始-->2
準(zhǔn)備開始-->3
1
2
3
4
5
6
7
8
9
10
11
結(jié)束
結(jié)束
結(jié)束
結(jié)束

三丶擴(kuò)展

qos:線程優(yōu)先級

和原有的對應(yīng)關(guān)系是:

* DISPATCH_QUEUE_PRIORITY_HIGH:         .userInitiated
* DISPATCH_QUEUE_PRIORITY_DEFAULT:      .default
* DISPATCH_QUEUE_PRIORITY_LOW:          .utility
* DISPATCH_QUEUE_PRIORITY_BACKGROUND:   .background

flags:

原文
DispatchWorkItemFlags
DispatchWorkItemFlags are an option set that configure the 
behavior of a DispatchWorkItem value, including its quality of 
service class and whether to create a barrier or spawn a new 
detached thread.

創(chuàng)建一個屏障或者新的獨(dú)立線程?聽不懂看個例子:
barrier
假設(shè)我們有一個并發(fā)的隊列用來讀寫一個數(shù)據(jù)對象。如果這個隊列里
的操作是讀的,那么可以多個同時進(jìn)行。如果有寫的操作,則必須保
證在執(zhí)行寫入操作時,不會有讀取操作在執(zhí)行,必須等待寫入完成后
才能讀取,否則就可能會出現(xiàn)讀到的數(shù)據(jù)不對。
__例子選自網(wǎng)友[不滅的小燈燈]的文章;

四丶總結(jié)

真是任性,api樣子變動太大了,一些api都廢棄掉了;
看我表情:
![]G(9J4XSDVSFB%@F(TZ38FX.gif](http://upload-images.jianshu.io/upload_images/1986326-7a2dbb1901d8e232.gif?imageMogr2/auto-orient/strip)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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