实现NSRunLoop

时间:2009-05-28 15:56:00

标签: iphone nstimer

好的,我已经阅读了有关为什么使用NSRunLoop而不是NSTimer调用来运行游戏循环并保持良好的帧速率更好的想法的文章。

但我在任何讨论中都没有看到的是在哪里创建NSRunLoop。

这应该放在didFinishLoading的末尾吗?

2 个答案:

答案 0 :(得分:2)

当您调用NSApplicationMain时,会自动为您生成运行循环。您可以使用以下任一方法访问runloop:

runloop = [NSRunLoop mainRunLoop];
runloop = [NSRunLoop currentRunLoop];

您链接的论坛中的代码如下所示:

// Yield to system calls (touches, etc.) for one ms.
while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.002, NO) == kCFRunLoopRunHandledSource);

CFRunLoopRunInMode上的文档:

SInt32 CFRunLoopRunInMode (   
    CFStringRef mode,
    CFTimeInterval seconds,
    Boolean returnAfterSourceHandled
);
     

运行当前线程的CFRunLoop   对象在特定模式下。

     

参数

     

模式

     

运行循环模式   跑。 ...

     

     

运行时间的长短   运行循环。 ...

     

returnAfterSourceHandled

     

旗帜   指示运行循环是否应该   处理完一个源后退出。 ...

这意味着CFRunLoopRunInMode获取当前线程的运行循环并处理所有等待的输入。 (喜欢接触......)。

while(… == kCFRunLoopRunHandledSource)确保处理所有事件。

只需按原样使用代码即可。

答案 1 :(得分:1)

基本上,NSRunLoop是

  

<强> 事件驱动模式

此OpenSource项目

  

https://github.com/wuyunfeng/LightWeightRunLoop

除了使用 IO Multiplexing 实施NSRunLoop之外,还有一些Runloop-Relative Fundation API,例如 执行选择器 (或延迟一些)在其他线程上, 计时器 URLConnection