如何延迟 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_suspenddispatch_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 排队的块的执行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

GCD中如何延迟处理任务

iOS - dispatch_after解说

如何在 Swift 中创建延迟?

iOS GCD使用dispatch_after、dispatch_time、dispatch_walltime

高压缩视频中出现的块的原因/用途/原因是啥?

如何让 webpack-dev-server 停止使用 React 延迟/Suspense 代码拆分在内容更改时下载不正确的块?