swift-- 延时操作封装

133 阅读1分钟

今天记录一下使用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: {
    // 写事件代码
})