需要解释Apple关于NSRunLoop的文档的摘录

时间:2014-02-19 10:22:50

标签: ios objective-c cocoa nsrunloop

Apple的官方文档有时难以理解,特别是对于非母语人士而言。这是Anatomy of NSRunLoop

的摘录
  

一个运行循环非常像它的名字声音。它是您的线程进入并用于运行事件处理程序以响应传入事件的循环。您的代码提供了用于实现运行循环的实际循环部分的控制语句 - 换句话说,您的代码提供了驱动运行循环的while或for循环。在循环中,使用运行循环对象来“运行”接收事件的事件处理代码并调用已安装的处理程序。

这让我很困惑。即使对于非主线程,我的代码也从不提供whilefor循环。这意味着什么?谁能解释一下?

2 个答案:

答案 0 :(得分:2)

继续阅读Using Run Loop Objects,Apple的代码示例会显示while循环等控制语句。

清单3-1

NSInteger loopCount = 10;
do
{
    // Run the run loop 10 times to let the timer fire.
    [myRunLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
    loopCount--;
}
while (loopCount);

清单3-2

do
{
    // Start the run loop but return after each source is handled.
    SInt32 result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, YES);

    // If a source explicitly stopped the run loop, or if there are no
    // sources or timers, go ahead and exit.
    if ((result == kCFRunLoopRunStopped) || (result == kCFRunLoopRunFinished))
        done = YES;

    // Check for any other exit conditions here and set the
    // done variable as needed.
}
while (!done);

使用NSRunLoop的预期方法确实需要您一次又一次地调用下一次运行,直到满足某个条件。

但是如果你使用-[NSRunLoop run]开始运行循环,它会在没有帮助的情况下无限期地运行。这就是主线程的作用。

如果您想知道为什么Apple允许(或希望)您控制每个循环,那么当每个CPU周期都很重要时,NeXTSTEP会在80年代出货。像-[NSRunLoop runMode:beforeDate:]这样的函数可以让你精确调整运行循环的频率和行为,直到每次运行。

答案 1 :(得分:1)

哦,你在主线程上运行循环,但你不知道。

在操作方法上设置断点并查看堆栈跟踪。会有类似的东西:

#9 0x00007fff912eaa29 in -[NSApplication run] ()

这就是循环。

在另一个帖子中,您经常不需要NSRunLoop的实例。它的主要能力是接收事件并发送它们。但是在一个额外的线程中,您希望在大多数情况下直接处理计算。有一个术语:额外的线程通常不是事件驱动的。

所以你很少有一个运行循环(并且必须运行它),特别是当你有使用运行循环调度的网络或文件访问时。在这种情况下,一个人不会运行线程的运行循环。