2014-09-11 40 views
3

比方说,我想在后面的时间来执行的代码块,所以我打电话dispatch_after像这样:如何延迟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秒。因此,这将是这个样子:

  • 呼叫dispatch_after以2秒的延迟
  • 1秒后,暂停节目未知时间
  • 恢复后,等待1秒,并执行块(所以总的延迟时间是2秒)

是否有这样做的一种方式?或者我应该使用另一种方法?

我知道dispatch_suspenddispatch_resume存在,但他们并不真正为我工作(或者我只是不知道如何正确使用它们)。

的解决方案并不一定要涉及到块,它也可能是延迟回调到指定的功能。重点是我希望能够暂停等待时间直到执行。

+0

我敢肯定这是不可能的。据我所知,一旦你发送了这个块,就没有办法改变它的发送时间。暂停队列也不会影响调度时间,它只会阻止一旦时间到了就运行该块。 – 2014-09-11 05:02:28

+0

那么你可以提出另一种方法吗?也许延迟回调函数?这也会很好。我其实想在动画序列中使用它。首先我在屏幕上制作一些动画,然后在2秒后我想执行一些代码,这些代码也可以做到这一点。它的伟大工程与'dispatch_after'但如果你发送的应用背景,然后把它带回来(在动画),定时搞砸了。块内的代码立即执行,而不是等待2秒。 – adam10603 2014-09-11 05:05:53

回答

0

把你的块的方法

-(void)myMethod{ 
//implementation of the block 
} 
要调用该块但在其2秒延迟

呼叫

[self performSelector:@selector(myMethod) withObject:nil afterDelay:2.0]; 

希望这有助于

+0

这给出了与'dispatch_after'相同的结果,但我仍然无法暂停2秒延迟。这是我的问题。 – adam10603 2014-09-11 05:21:23

+0

上面的方法,会停止2秒,然后在里面启动它的方法。 – 2014-09-11 05:29:08

+0

是的,但我希望能够随时暂停并恢复2秒延迟。 – adam10603 2014-09-11 05:36:50

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];

+0

不完全是我需要的不幸。 1秒-1秒的分割就是一个例子。中断可能在2秒钟内随时发生。我不相信有没有办法在回调中暂停延迟。 – adam10603 2014-09-11 05:32:38

+0

也许如果我保存中断发生时的当前时间,然后计算恢复时的流逝时间,我可以简单地检查是否还有剩余时间,并用余下的时间调用另一个performSelector事物。我会尝试 – adam10603 2014-09-11 05:34:56