這篇文章對自定義隊列的串并行,優(yōu)先級,定時器和workItem講的更為詳細,有興趣的可以直接去看
隊列串行和并行
func dispatchQueueAttributes() {
let queue = DispatchQueue(label: "myQueue")
self.queue = queue
queue.async {
for i in 0 ... 5 {
print("??\(i)")
}
}
queue.async {
for i in 0 ... 5 {
print("??\(i)")
}
}
}
執(zhí)行效果跟預期的一樣,串行執(zhí)行.如果想要并行的話,需要在初始化隊列的時候,加上一個參數(shù).
func dispatchQueueAttributes() {
// 自定義一個隊列
let queue = DispatchQueue(label: "并行隊列", attributes: .concurrent)
self.queue = queue
queue.async {
for i in 0 ... 5 {
print("??\(i)")
}
}
queue.async {
for i in 0 ... 5 {
print("??\(i)")
}
}
}
這樣就打到了一個自定義隊列并行的效果.
參數(shù) attributes是DispatchQueue.Attributes類型
DispatchQueue.Attributes
有兩個值
// 這個上面已經(jīng)用了,是讓隊列并行
public static let concurrent: DispatchQueue.Attributes
// 這個是讓隊列先不會執(zhí)行,需要手動調(diào)用隊列才會去執(zhí)行
public static let initiallyInactive: DispatchQueue.Attributes
var queue: DispatchQueue?
func dispatchQueueAttributes() {
// 自定義一個隊列
let queue = DispatchQueue(label: "并行隊列", attributes: .initiallyInactive)
self.queue = queue
queue.async {
for i in 0 ... 5 {
print("??\(i)")
}
}
queue.async {
for i in 0 ... 5 {
print("??\(i)")
}
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
queue?.activate()
}
定義一個隊列, attributes設置為. initiallyInactive, 這個時候隊列不會被立馬執(zhí)行,需要調(diào)用隊列的activate(),隊列的任務才會被開始執(zhí)行, 默認還是串行執(zhí)行的.
如果希望隊列需要并行執(zhí)行,又希望是自己手動調(diào)用,可以這樣初始化隊列.(iOS10以后才能用)
var queue: DispatchQueue?
func dispatchQueueAttributes() {
// 自定義一個隊列
let queue = DispatchQueue(label: "并行隊列", attributes: [.initiallyInactive, .concurrent])
self.queue = queue
queue.async {
for i in 0 ... 5 {
print("??\(i)")
}
}
queue.async {
for i in 0 ... 5 {
print("??\(i)")
}
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
queue?.activate()
}
總結(jié):
- attributes: 默認為串行
- concurrent: 并行
- initiallyInactive: 先不執(zhí)行,需要主動調(diào)用隊列才會執(zhí)行(串行執(zhí)行)
- [.concurrent, .initiallyInactive] // 主動調(diào)用執(zhí)行(并行執(zhí)行)
隊列的優(yōu)先級
創(chuàng)建兩個隊列異步執(zhí)行,誰先執(zhí)行完事靠優(yōu)先級決定,誰的優(yōu)先級高,CUP就會給那個隊列分配的資源就多,就會提前完成
設置優(yōu)先級是這個設置:
DispatchQoS
優(yōu)先級順序,從高到低
userInteractive
userInitiated
default
utility
background
unspecified
在創(chuàng)建隊列和使用系統(tǒng)管理的全局隊列都可以設置優(yōu)先級.
func dispatchQoS() {
let queue1 = DispatchQueue(label: "隊列1", qos: .userInteractive)
let queue2 = DispatchQueue(label: "隊列2", qos: .utility)
queue1.async {
for i in 0 ... 5 {
print("??\(i)")
}
}
queue2.async {
for i in 0 ... 5 {
print("??\(i)")
}
}
let globalQueue = DispatchQueue.global(qos: .background)
globalQueue.async {
for i in 0 ... 5 {
print("??\(i)")
}
}
}
workItem
var workItem: DispatchWorkItem?
workItem = DispatchWorkItem {
print("執(zhí)行")
}
// workItem執(zhí)行完成會在指定的線程回調(diào)這個block
workItem?.notify(queue: .main, execute: {
print("執(zhí)行完成")
})
// 執(zhí)行
workItem?.perform()