Apple的官方文档有时难以理解,特别是对于非母语人士而言。这是Anatomy of NSRunLoop
的摘录一个运行循环非常像它的名字声音。它是您的线程进入并用于运行事件处理程序以响应传入事件的循环。您的代码提供了用于实现运行循环的实际循环部分的控制语句 - 换句话说,您的代码提供了驱动运行循环的while或for循环。在循环中,使用运行循环对象来“运行”接收事件的事件处理代码并调用已安装的处理程序。
这让我很困惑。即使对于非主线程,我的代码也从不提供while
或for
循环。这意味着什么?谁能解释一下?
答案 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
的实例。它的主要能力是接收事件并发送它们。但是在一个额外的线程中,您希望在大多数情况下直接处理计算。有一个术语:额外的线程通常不是事件驱动的。
所以你很少有一个运行循环(并且必须运行它),特别是当你有使用运行循环调度的网络或文件访问时。在这种情况下,一个人不会运行线程的运行循环。