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

Loc*_*eyu 5 time xcode cocoa runloop ios

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

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
Run Code Online (Sandbox Code Playgroud)

这似乎正是我想要的,除了有时函数立即返回而不等待所需的时间(1秒).

任何人都可以告诉我这可能导致什么?在允许运行循环运行的同时等待的正确方法是什么?

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

Ali*_*are 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#>
});
Run Code Online (Sandbox Code Playgroud)

  • 这确实有道理,也没有道理。你可以通过让你的线程进入睡眠状态(“[NSThread sleepForTimeinterval:]”或“usleep()”?)来做到这一点,但这会造成主动暂停,在正确的 OOP 编程模式中不建议这样做。如果您在主运行循环上执行 for 循环,它当然会“冻结”您的应用程序。所以这可能是糟糕的设计。 (2认同)
  • 我看到的解决方案,如果你真的想要执行每次相隔1秒的N次迭代,那就是`for(int i = 0; i <N; ++ i){dispatch_after(N seconds,mainQueue,^ {...}) ; 你的循环将调度N`dispatch_after`调用,第N次迭代在当前时间后N秒调度.或者使用除传统for循环之外的任何东西来执行迭代,例如在迭代结束时调用`dispatch_after`以在1秒后调度下一次迭代的递归代码. (2认同)