取消dispatch_after()方法?

时间:2015-01-22 11:45:09

标签: ios grand-central-dispatch

有没有办法取消将来某段时间安排的 dispatch_after(),到目前为止尚未解雇? 我尝试从服务器上做类似调度程序的调度程序,这种方法就像我想要的那样,但是,我喜欢在某个时候取消并重新安排它。 是否有可能或我必须回退并使用NSTimer?

4 个答案:

答案 0 :(得分:23)

没有办法阻止dispatch_block一旦发送到它的队列就执行,这意味着你的dispatch_after无法取消。唯一的选择是在块中添加要在运行时检查的条件以防止执行。 即

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

答案 1 :(得分:16)

好的,所以,收集了所有答案,并且可能的解决方案似乎是这种情况下最好的解决方案(保持简洁性)是调用performSelector:withObject:afterDelay:并在需要时使用cancelPreviousPerformRequestsWithTarget:调用取消它。就我而言 - 就在安排下一次延迟通话之前:

[NSObject cancelPreviousPerformRequestsWithTarget: self selector:@selector(myDelayedMethod) object: self];

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

答案 2 :(得分:6)

为此我使用了这个类:

https://github.com/SebastienThiebaud/dispatch_cancelable_block

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

答案 3 :(得分:1)

使用调度计时器源(无论如何dispatch_after内部使用)。

可以取消调度计时器源或在创建后更改其计时器参数。