今天记录一下使用GCD进行延时操作的封装代码,以便后续查看使用,直接上代码:
public typealias Task = (_ cancel : Bool) -> ()
// 全局线程延时
public func delayForGlobalQueue(_ time: TimeInterval, task: @escaping () -> Void) -> Task? {
return delay(time, queue: DispatchQueue.global(), task: task)
}
// 主线程延时
public func delayForMainQueue(_ time: TimeInterval, task: @escaping () -> Void) -> Task? {
return delay(time, queue: DispatchQueue.main, task: task)
}
public func delay(_ time: TimeInterval, queue: DispatchQueue, task: @escaping () -> Void) -> Task? {
func dispatch_later(block: @escaping ()->()) {
let t = DispatchTime.now() + time
queue.asyncAfter(deadline: t, execute: block)
}
var closure: (() -> Void)? = task
var result: Task?
let delayedClosure: Task = {
cancel in
if let internalClosure = closure {
if (cancel == false) {
queue.async(execute: internalClosure);
}
}
closure = nil
result = nil
}
result = delayedClosure
dispatch_later {
if let delayedClosure = result {
delayedClosure(false)
}
}
return result;
}
public func cancelTask(_ task:Task?) {
task?(true)
}
使用方法如下:
_ = delayForMainQueue(1.5, task: {
// 写事件代码
})