一.概覽
程序啟動時,最先執(zhí)行主線程,來描繪用戶界面,處理觸摸等交互事件.如果耗時操作被放在主線程時,就會妨礙主運行循環(huán)(runloop)的執(zhí)行,從而使頁面長時間停滯,用戶不能交互.
先來理解關(guān)鍵字DispatchQueue的意思, 是執(zhí)行處理的隊列,從而衍生出兩種隊列.一種是等待現(xiàn)在執(zhí)行中助理的隊列Serial DispatchQueue(串行隊列),另一種是,不等待現(xiàn)在執(zhí)行中處理的隊列Concurrent DispatchQueue(并行隊列),串行就是一個個按順序處理事件,并行就是使用多個線程同時處理多個事件.
二.知道了是存在這兩種隊列,怎么得到這些DispatchQueue呢?
方法有兩種:
-
第一種:就是通過GCD的API生成DispatchQueue,在OC和Swift2.0中都使用了dispatch_queue_create的方法來生成,可是Swift3.0找不到這個方法了......不過可以用下面的方法來創(chuàng)建隊列
//創(chuàng)建串行同步隊列 let chuanxingtongbuQueue = DispatchQueue.init(label: "chuanxintongbu") chuanxingtongbuQueue.sync { print("1 ===== \(Thread.current)") } chuanxingtongbuQueue.sync { print("2 ===== \(Thread.current)") } chuanxingtongbuQueue.sync { print("3 ===== \(Thread.current)") }
//輸出結(jié)果:
1 ===== <NSThread: 0x61800007d400>{number = 1, name = main}
2 ===== <NSThread: 0x61800007d400>{number = 1, name = main}
3 ===== <NSThread: 0x61800007d400>{number = 1, name = main}
//創(chuàng)建并行異步隊列
let bingxingyibuQueue = DispatchQueue(label: "bingxingyibu", attributes: DispatchQueue.Attributes.concurrent)
bingxingyibuQueue.async {
print("1 ===== \(Thread.current)")
}
bingxingyibuQueue.async {
print("2 ===== \(Thread.current)")
}
bingxingyibuQueue.async {
print("3 ===== \(Thread.current)")
}
// 輸出結(jié)果:
1 ===== <NSThread: 0x618000261e00>{number = 3, name = (null)}
2 ===== <NSThread: 0x618000261e00>{number = 3, name = (null)}
3 ===== <NSThread: 0x608000271380>{number = 4, name = (null)}
- 第二種:獲取系統(tǒng)標(biāo)準提供的DispatchQueue,系統(tǒng)給提供了2個:MainDispatchQueue(主隊列)和GlobalDispatchQueue(全局隊列).
GlobalDispatchQueue是并行的,只要獲取就能使用. GlobalDispatchQueue有四個優(yōu)先級,High(高優(yōu)先級),Default(默認優(yōu)先級),Low(低優(yōu)先級),Backgroud(后臺優(yōu)先級)
/*
DISPATCH_QUEUE_PRIORITY_HIGH: .userInitiated
DISPATCH_QUEUE_PRIORITY_DEFAULT: .default
DISPATCH_QUEUE_PRIORITY_LOW: .utility
DISPATCH_QUEUE_PRIORITY_BACKGROUND: .background
*/
//qos:可以改變參數(shù)來改變優(yōu)先級,參數(shù)如上
DispatchQueue.global(qos: .background).async {
//進行耗時操作
DispatchQueue.main.async {
//更新UI
}
}