如何运行CFRunLoop()一段时间,然后停止?

时间:2017-06-15 00:54:19

标签: objective-c

我目前有一些代码需要运行CFRunLoopRun()

这无限期地运行。我想用只运行一段时间的东西来代替它,比如30秒。

我尝试了CFRunLoopRunInMode(),但它会立即退出。

CFRunLoopRun(); // Works but never stops, I need to stop after 30s
CFStringRef mode = (__bridge CFStringRef)@"mode";
CFTimeInterval timeInterval = 10.0;
CFRunLoopRunInMode(mode, timeInterval, FALSE); // Doesn't work, syntax is wrong?, stops immediately

1 个答案:

答案 0 :(得分:2)

您正在使用自定义模式。看起来你只是在为这一个电话做好准备。这表明在该模式下没有安排输入源。如果没有输入源,则所有运行循环运行函数立即退出。

CFRunLoopRunInMode()实际上返回一个值,表示它退出的原因。你应该检查一下。

CFRunLoopRun()的区别在于它以默认模式(kCFRunLoopDefaultMode)运行运行循环,而不是您的自定义模式。该模式几乎肯定会安排输入源(至少,假设这是主线程,因此主运行循环)。

所以,你可以这样做:

CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10.0, FALSE);

所有这些都说,在一段固定时间内运行运行循环很少是正确的方法。你究竟想要实现什么目标?是什么让你得出结论,你需要运行运行循环10秒?为什么不回到正常的事件循环并使用计时器在10秒内完成一些工作?