typealias Task = (_ cancel: Bool) ->()
class delayGCD {
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: (()->())? = 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(3) { print("3 秒后输出") }
取消的话,我们可以先保留⼀个对 Task 的引⽤,然后调⽤ cancel :
let task = delay(5) { print("5秒后打印") }
cancel(task)
下面是完整的使用:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let task = delayGCD().delay(2) {
print("延迟两秒")
}
// 取消延迟
delayGCD().cancel(task)
}
}