創(chuàng)建可以取消的子線程任務(wù)
typealias Task = (_ cancel : Bool) -> Void
func delay(_ time: TimeInterval, task: @escaping ()->()) -> Task? {
func dispatch_later(_ block: @escaping ()->()) {
let t = DispatchTime.now() + time
DispatchQueue.main.asyncAfter(deadline: t, execute: block)
}
var closure: (()->Void)? = task
var result: Task?
let delayedClosure: Task = {
cancel in
if let internalClosure = closure {
if (cancel == false) {
DispatchQueue.main.async(execute: internalClosure)
}
}
closure = nil
result = nil
}
result = delayedClosure
dispatch_later {
if let delayedClosure = result {
delayedClosure(false)
}
}
return result;
}
func cancel(_ task: Task?) {
task?(true)
}
delay(2) { print("2 秒后輸出") }
let task = delay(5) { print("撥打 110") }
// 仔細(xì)想一想..
// 還是取消為妙..
cancel(task)
一般的應(yīng)用子線程任務(wù)主線程刷新
// 創(chuàng)建目標(biāo)隊(duì)列
let workingQueue = DispatchQueue(label: "my_queue")
// 派發(fā)到剛創(chuàng)建的隊(duì)列中腕窥,GCD 會(huì)負(fù)責(zé)進(jìn)行線程調(diào)度
workingQueue.async {
// 在 workingQueue 中異步進(jìn)行
print("努力工作")
Thread.sleep(forTimeInterval: 2) // 模擬兩秒的執(zhí)行時(shí)間
DispatchQueue.main.async {
// 返回到主線程更新 UI
print("結(jié)束工作,更新 UI")
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者