在继续阅读文档之前,我的大脑在这一点上陷入了困境:
- (void)threadMainRoutine {
BOOL moreWorkToDo = YES;
BOOL exitNow = NO;
NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; // is this THE run loop?
// some stuff...
while (moreWorkToDo && !exitNow) { // or is THIS the run loop?
// some stuff
[runLoop runUntilDate:[NSDate date]];
// some stuff
}
// some stuff
}
我在代码示例中添加了一些注释。也许有人可以解释一下,如果有一个runLoop对象接收到-runUntilDate:消息,为什么会有一个while循环。我的意思是:这里的循环是谁?我看到两个。首先,这显然是一个正在运行的循环,然后它调用了一个听起来像很好地运行循环的方法。
stateConfused = YES;
pleaseExplain = YES;
最佳答案
从技术上讲,NSRunLoop
在内部循环(它循环“直到日期”)。这为您提供了定期退出线程的机会-如果您使用run
而不是runUntilDate:
,则NSRunLoop
将永远在内部循环(您无需将其包装在while循环中,但也永远无法停止它)。这是主线程的正常行为,而不是通常具有需要定期检查的退出条件的工作线程的正常行为。runLoop
永远不会更改moreWorkToDo
或exitNow
的值(当线程完成工作或用户退出应用程序时,您有责任执行此操作),但是这些是您决定是否要终止线程的方法。
根据您希望线程如何运行,可以将这些标志替换为[NSApp isRunning]
和[tasksRemainingForThisThreadToProcess count] != 0
或类似标记。
(种族条件警告:如果您在处理完所有剩余任务后结束线程,请注意在tasksRemainingForThisThreadToProcess
为空时切勿向该线程发送其他任务,因为这表明该线程将退出)。
关于iphone - 在这里确切地被称为 “Run Loop”是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1609583/