如何延迟 dispatch_after 排队的块的执行? [复制]
Posted
技术标签:
【中文标题】如何延迟 dispatch_after 排队的块的执行? [复制]【英文标题】:How to delay the execution of a block that was queued by dispatch_after? [duplicate] 【发布时间】:2014-09-11 04:55:06 【问题描述】:假设我想稍后执行一段代码,所以我像这样调用dispatch_after
:
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
/* code */
);
但是如果我想在执行开始之前“暂停”我的程序怎么办?假设我想在此调用后 1 秒暂停程序未知时间。然后在暂停之后,我想恢复队列中的 2 秒等待。所以它看起来像这样:
延迟 2 秒调用 dispatch_after 1 秒后,暂停程序未知时间 恢复后,等待 1 秒再执行块(所以总延迟为 2 秒)有没有办法做到这一点?还是应该使用其他方法?
我知道dispatch_suspend
和dispatch_resume
存在,但它们并不真正适合我(或者我只是不知道如何正确使用它们)。
解决方案不一定要涉及块,也可以是对指定函数的延迟回调。关键是我希望能够暂停等待时间直到执行。
【问题讨论】:
我很确定这是不可能的。据我所知,一旦你发送了块,就无法更改它的发送时间。暂停队列也不会影响调度时间,它只会阻止该块在时间到时运行。 那么您能建议另一种方法吗?也许是对函数的延迟回调?那也不错。我实际上想在动画序列中使用它。首先我在屏幕上制作动画,然后在 2 秒后我想执行一些代码,这些代码也对它做一些事情。它适用于dispatch_after
,但如果您将应用程序发送到后台然后将其带回(在动画期间),时间就会搞砸。块内的代码立即执行,而不是等待 2 秒。
【参考方案1】:
你无法做到这一点,但有一种方法可以做类似的事情。
延迟你的方法 2 秒:
[self performSelector:@selector(yourMethod) withObject:nil afterDelay:2.0];
1 秒后,取消你的方法:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(yourMethod) object:nil];
过了一段未知的时间后,重新调用你的方法并延迟 1 秒后执行它:
[self performSelector:@selector(yourMethod) withObject:nil afterDelay:1.0];
【讨论】:
不幸的是,这不是我所需要的。 1 秒 - 1 秒分割只是一个例子。中断可以在 2 秒窗口内的任何时间发生。我不敢相信没有办法暂停回调延迟。 也许如果我在中断发生时保存当前时间,然后在恢复时计算经过的时间,我可以简单地检查是否还有剩余时间,并用剩余时间调用另一个 performSelector 事物。我会试试的【参考方案2】:把你的块放在一个方法中
-(void)myMethod
//implementation of the block
你想在哪里调用这个块,但在它之前有 2 秒的延迟,
打电话
[self performSelector:@selector(myMethod) withObject:nil afterDelay:2.0];
希望对你有帮助
【讨论】:
这给出了与dispatch_after
相同的结果,但我仍然无法暂停 2 秒的延迟。这就是我的问题的重点。
上面的方法,会停止2秒,然后触发里面的方法。
是的,但我希望能够随时暂停和恢复 2 秒延迟。
我不认为这是可能的。以上是关于如何延迟 dispatch_after 排队的块的执行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
iOS GCD使用dispatch_after、dispatch_time、dispatch_walltime
如何让 webpack-dev-server 停止使用 React 延迟/Suspense 代码拆分在内容更改时下载不正确的块?