Stop dispatch_after

后端 未结 5 750
迷失自我
迷失自我 2020-12-24 03:36

I use an animation for specify a tip to help the interaction with delay using these:

 let delay = 1.8 * Double(NSEC_PER_SEC)
    let time = dispatch_time(DIS         


        
5条回答
  •  自闭症患者
    2020-12-24 04:03

    Here's a general solution I wrote to cancel a dispatch_after in Swift:

    typealias cancellable_closure = (() -> ())?
    
    func dispatch_after(#seconds:Double, queue: dispatch_queue_t = dispatch_get_main_queue(), closure:()->()) -> cancellable_closure {
        var cancelled = false
        let cancel_closure: cancellable_closure = {
            cancelled = true
        }
    
        dispatch_after(
            dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC))), queue, {
                if !cancelled {
                    closure()
                }
            }
        )
    
        return cancel_closure
    }
    
    func cancel_dispatch_after(cancel_closure: cancellable_closure) {
        cancel_closure?()
    }
    

    Usage:

    let doSomethingLater = dispatch_after(seconds: 3.0) {
        something()
    }
    ....
    if shouldCancelForSomeReason {
        cancel_dispatch_after(doSomethingLater)
    }
    

    By default it runs on the main queue, but you can pass in a parameter for it to run on another queue:

    let doSomethingLater = dispatch_after(seconds: 3.0, queue: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
        something()
    }
    

提交回复
热议问题