我想在事件发生后的10秒钟内运行一段代码,但是我希望能够取消它,这样,如果在这10秒钟之前发生了某些事情,那么经过10秒钟后该代码将无法运行。
我一直在使用它,但是它不能取消:
static func delay(delay:Double, closure:()->()) { dispatch_after( dispatch_time( DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)) ), dispatch_get_main_queue(), closure ) }
我该怎么做?
试试看(Swift 2.x,请参阅下面有关Swift 3的David的回答):
typealias dispatch_cancelable_closure = (cancel : Bool) -> () func delay(time:NSTimeInterval, closure:()->()) -> dispatch_cancelable_closure? { func dispatch_later(clsr:()->()) { dispatch_after( dispatch_time( DISPATCH_TIME_NOW, Int64(time * Double(NSEC_PER_SEC)) ), dispatch_get_main_queue(), clsr) } var closure:dispatch_block_t? = closure var cancelableClosure:dispatch_cancelable_closure? let delayedClosure:dispatch_cancelable_closure = { cancel in if let clsr = closure { if (cancel == false) { dispatch_async(dispatch_get_main_queue(), clsr); } } closure = nil cancelableClosure = nil } cancelableClosure = delayedClosure dispatch_later { if let delayedClosure = cancelableClosure { delayedClosure(cancel: false) } } return cancelableClosure; } func cancel_delay(closure:dispatch_cancelable_closure?) { if closure != nil { closure!(cancel: true) } } // usage let retVal = delay(2.0) { println("Later") } delay(1.0) { cancel_delay(retVal) }