取消dispatch_after()方法?

有没有办法取消dispatch_after()预定一段时间以后,到目前为止还没有开火? 我正在尝试为服务器上的更新做一个调度程序,而这个方法就像我想要的,但是,我希望在某个时候取消并重新调度它。 是否有可能,或者我必须回退并使用NSTimer?

一旦dispatch_block被调度到队列中,就没有办法阻止dispatch_block的执行,这意味着你的dispatch_after不能被取消。 唯一的select是在你的块中添加一个在运行时被检查的条件,以防止执行。 即。

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(), ^ { if(self.shouldExecuteDispatchBlock) { // do your stuff } }); 

好吧,所有收集到的答案和可能的解决scheme,对于这种情况(保持简单性)来说似乎是最好的方法是调用performSelector:withObject:afterDelay:并在需要时用cancelPreviousPerformRequestsWithTarget: call来取消它。 在我的情况下 – 就在安排下一个延迟的呼叫之前:

 [NSObject cancelPreviousPerformRequestsWithTarget: self selector:@selector(myDelayedMethod) object: self]; [self performSelector:@selector(myDelayedMethod) withObject: self afterDelay: desiredDelay]; 

为此我使用这个类:

https://github.com/SebastienThiebaud/dispatch_cancelable_block

你可以调用一个cancel()函数来撤销块中的内容。

使用调度计时器源(即dispatch_after内部使用)。

调度计时器源可以被取消,或者在创build后改变其定时器参数。