取消dispatch_after()方法? [重复]

问题描述 投票:0回答:4

有没有办法取消 dispatch_after() 安排在未来某个时间,但到目前为止尚未触发? 我正在尝试制作类似于服务器更新调度程序的东西,这种方法正是我想要的,但是,我想在某个时候取消并重新安排它。 是否有可能,或者我必须回退并使用 NSTimer?

ios grand-central-dispatch
4个回答
26
投票

一旦将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 }  });

19
投票

好的,所以,收集了所有答案和可能的解决方案后,对于这种情况,最好的解决方案(保持简单性)似乎是调用

performSelector:withObject:afterDelay:
并在需要时使用
cancelPreviousPerformRequestsWithTarget:
调用取消它。就我而言 - 在安排下一个延迟通话之前:

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

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

6
投票

为此目的,我使用了此类:

https://github.com/SebastienThiebaud/dispatch_cancelable_block

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


3
投票

使用调度计时器源(这就是

dispatch_after
内部使用的)。

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

© www.soinside.com 2019 - 2024. All rights reserved.