6

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

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

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

任何人都可以让我知道可能导致这种情况的原因吗?在允许运行循环运行时等待的正确方法是什么?

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

4

4 回答 4

8

您应该为此使用 GCD dispatch_after。它更新更高效(并且是线程安全的),并且非常易于使用。

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

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#>
});
于 2012-10-12T19:51:40.887 回答
1

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

于 2012-10-12T19:18:59.650 回答
1

你试过performSelector:withObject:afterDelay:吗?

来自Apple 文档

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

于 2012-10-12T21:04:40.447 回答
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 
于 2015-12-14T04:06:53.867 回答