取消dispatch_after()方法?

Ole*_*yuk 29 grand-central-dispatch ios

有没有办法取消未来一段时间内安排的dispatch_after(),到目前为止还没有解雇?我正在尝试为服务器更新调度程序,这个方法就像我想要的那样,但是,我希望在某些时候取消并重新安排它.是否有可能或我必须回退并使用NSTimer?

Flo*_*rel 24

没有办法阻止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 }  });
Run Code Online (Sandbox Code Playgroud)

  • Apple在iOS 8中引入了`dispatch_block_cancel`.它异步取消了使用`dispatch_block_create`创建的块.https://developer.apple.com/reference/dispatch/1431058-dispatch_block_cancel?language=objc (3认同)

Ole*_*yuk 17

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

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

[self performSelector:@selector(myDelayedMethod) withObject: self afterDelay: desiredDelay];
Run Code Online (Sandbox Code Playgroud)


Zol*_*adi 6

为此,我使用了这个类:

https://github.com/SebastienThiebaud/dispatch_cancelable_block

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

  • 如果你在Swift中使用它 - 你可以在这里查看https://github.com/katleta3000/CancelBlocks/ (3认同)

das*_*das 3

使用调度计时器源(dispatch_after无论如何,这都是内部使用的)。

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