- 延遲執(zhí)行:
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+3.0, execute: {
[unowned self] () -> Void in
//延遲操作
})
PS. DispatchTime對(duì)象用now()獲取當(dāng)前時(shí)間,加上秒數(shù)即可
- 全局隊(duì)列執(zhí)行耗時(shí)操作后切換到主線程刷新UI
DispatchQueue.global().async {
// 耗時(shí)操作
DispatchQueue.main.async {
// 主線程刷新UI
}
}
- 同步執(zhí)行操作
DispatchQueue.global().sync {
// 同步執(zhí)行
}
- 創(chuàng)建隊(duì)列
DispatchQueue的默認(rèn)初始化方法創(chuàng)建的是同步隊(duì)列,如果要?jiǎng)?chuàng)建并發(fā)的隊(duì)列,在attributes中聲明.concurrent蓖康。
// 同步隊(duì)列
let serialQueue = DispatchQueue(label: "name")
// 并發(fā)隊(duì)列
let concurrentQueue = DispatchQueue(label: "name", attributes: .concurrent)
- 執(zhí)行多個(gè)任務(wù)后再做某種操作
使用DispatchGroup,所有操作都完成后執(zhí)行notify劫狠。
let group = DispatchGroup()
let queue1 = DispatchQueue(label: "queue1")
queue1.async(group: group) {
// 執(zhí)行任務(wù)1
}
let queue2 = DispatchQueue(label: "queue2")
queue1.async(group: group) {
// 執(zhí)行任務(wù)2
}
group.notify(queue: DispatchQueue.main) {
// 執(zhí)行完成
}
如果要在某一任務(wù)或某幾個(gè)任務(wù)后后執(zhí)行其他任務(wù)夸研,可在任務(wù)間加上等待:
//等待組內(nèi)任務(wù)全部完成
group.wait(timeout: DispatchTime.distantFuture)
- DispatchWorkItem的使用
DispatchWorkItem可理解為任務(wù)條目,可初始化傳入優(yōu)先級(jí)等參數(shù)媳拴,因其有默認(rèn)值黄橘,也可只傳入一個(gè)閉包。同樣禀挫,它也有wait方法旬陡,使用和上面差不多。
let queue = DispatchQueue(label: "queue", attributes: .concurrent)
let workItem = DispatchWorkItem {
// 任務(wù)
}
queue.async(execute: workItem)
print("before waiting")
workItem.wait()
print("after waiting")
- barrier柵欄
barrier的加入會(huì)等到在它加入隊(duì)列之前的“任務(wù)”執(zhí)行完畢后语婴,才開(kāi)始執(zhí)行描孟。在它之后加入隊(duì)列的“任務(wù)”驶睦,則等到這個(gè)“任務(wù)”執(zhí)行完畢后才開(kāi)始執(zhí)行。這里的“任務(wù)”用DispatchWorkItem創(chuàng)建匿醒。
let barrierWorkItem = DispatchWorkItem(flags: .barrier) {
// 柵欄操作场航,比如之前有若干“讀”操作,這里有“寫(xiě)”操作
}
let queue = DispatchQueue(label: "queue", attributes: .concurrent)
queue.async(execute: barrierWorkItem)
- 信號(hào)量
為了線程安全的統(tǒng)計(jì)數(shù)量廉羔,會(huì)使用信號(hào)量作計(jì)數(shù)溉痢。初始化方法只有一個(gè),傳入一個(gè)Int類型的數(shù)憋他。
let semaphore = DispatchSemaphore(value: 10)
// 信號(hào)量減一
semaphore.wait()
// 信號(hào)量加一
semaphore.signal()