在继续阅读文档之前,我的大脑在这一点上陷入了困境:

- (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永远不会更改moreWorkToDoexitNow的值(当线程完成工作或用户退出应用程序时,您有责任执行此操作),但是这些是您决定是否要终止线程的方法。

根据您希望线程如何运行,可以将这些标志替换为[NSApp isRunning][tasksRemainingForThisThreadToProcess count] != 0或类似标记。

(种族条件警告:如果您在处理完所有剩余任务后结束线程,请注意在tasksRemainingForThisThreadToProcess为空时切勿向该线程发送其他任务,因为这表明该线程将退出)。

关于iphone - 在这里确切地被称为 “Run Loop”是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1609583/

10-09 17:58