Swift GCD中沒(méi)有原生支持取消等的操作笼呆,這些操作就需要我們自己動(dòng)手去實(shí)現(xiàn)世澜。
在Playground
中想要支持異步撒穷,需要將needsIndefiniteExecution
參數(shù)設(shè)置為true
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
下面就是取消block的demo:
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)
}
let task = delay(2) { print("兩秒后輸出") }
參考: