Swift那些事之-延时任务

1,042 阅读1分钟

学习Swift中的小事情之-延时执行任务或者取消任务

//: Playground - noun: a place where people can play


import UIKit


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(5) { print("执行函数")}
cancel(task)


//MARK:使用系统提供的函数
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
    print("三秒后打印")
}