取消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];
使用调度计时器源(即dispatch_after
内部使用)。
调度计时器源可以被取消,或者在创build后改变其定时器参数。