在允许运行循环继续的同时延迟的正确方法

时间:2012-10-12 19:13:34

标签: ios xcode cocoa time runloop

我需要延迟一段时间,但允许同一个runloop上的其他内容继续运行。我一直在使用以下代码来执行此操作:

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];

这似乎完全符合我的要求,除非有时函数会立即返回而不等待所需的时间(1秒)。

任何人都可以让我知道是什么原因引起的吗?在允许运行循环运行的同时等待的正确方法是什么?

注意:我想以类似于sleep()的方式延迟,以便在延迟之后我回到与之前相同的执行流中。

5 个答案:

答案 0 :(得分:8)

你应该使用GCD和dispatch_after。它更新近,更高效(并且线程安全且全部),并且非常易于使用。

Xcode中甚至还嵌入了一个代码片段,因此如果您开始输入dispatch_after,它会建议片段,如果您验证它,则会在您的代码中为您编写准备好的2-3行:)< / p>

Code Snippet suggestion by Xcode

int64_t 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 to be executed on the main queue after delay#>
});

答案 1 :(得分:1)

使用NSTimer在一定延迟后触发对某些方法的调用。

答案 2 :(得分:1)

The accepted SO answer here应该有所帮助。您还可以使用GCD实现David的dispatch_afer(explained here),这是一种更新的方式来做同样的事情。

有几个这样的GCD功能值得了解,而且它们非常易于使用。

答案 3 :(得分:1)

您是否尝试过performSelector:withObject:afterDelay:

来自Apple documentation

  

在延迟后使用默认模式在当前线程上调用接收器的方法。

答案 4 :(得分:0)

我有类似的问题,这是我的解决方案。希望它也适用于其他人。

__block bool dispatched = false;
while ( put your loop condition here )
{
    if (dispatched)
    {
        // We want to relinquish control if we are already dispatched on this iteration.
        [ [ NSRunLoop currentRunLoop ] runMode: NSDefaultRunLoopMode beforeDate:[ NSDate date ] ];
        continue;
    }

    // mark that a dispatch is being scheduled
    dispatched = true;

    int64_t delayInNanoSeconds = (int64_t) (0.1 * (float) NSEC_PER_SEC);
    dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, delayInNanoSeconds);

    dispatch_after(delayTime, dispatch_get_main_queue(), ^() {
       // Do your loop stuff here
       // and now ready for the next dispatch
       dispatched = false;
    } );
}  // end of while