2

在继续阅读文档之前,我的大脑在这一点上卡住了:

- (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 循环。我的意思是:这里的循环是谁?我看到两个。首先 while 这显然是一个正在运行的循环,然后它调用一个听起来像是在运行一个循环的方法。

stateConfused = YES;
pleaseExplain = YES;
4

3 回答 3

1

从技术上讲,NSRunLoop内部循环(它循环“直到日期”)。这为您提供了一个定期退出线程的机会——如果您使用willrun而不是runUntilDate:thenNSRunLoop将永远在内部循环(您不需要将其包装在 while 循环中,但您也永远无法停止它)。这是主线程的正常行为,而不是通常具有需要定期检查的退出条件的工作线程。

runLoop永远不会改变moreWorkToDoor的值exitNow(当线程的工作完成或用户退出您的应用程序时,您负责执行此操作)但这些是您决定是否希望线程终止的方式。

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

(竞争条件警告:如果在处理完所有剩余任务后结束线程,请注意不要在线程tasksRemainingForThisThreadToProcess为空时向线程发送另一个任务,因为这表明线程将退出)。

于 2009-10-23T00:47:01.110 回答
0

一个是负责维护运行循环状态的对象,另一个是实际循环。

于 2009-10-22T19:59:02.387 回答
0

第一个是实际的runloop,返回的runloop[NSRunLoop currentRunLoop]是由UIApplication创建的。简化后,它接收所有操作系统事件(键盘、鼠标等)并将它们分派给您的程序。如果您调用[runLoop runUntilDate:[NSDate date]];这将在指定日期过去后返回,但您的程序将继续接收操作系统事件。请参阅此链接

这与调用不同:

[[NSThread currentThread] sleepFormTimeInterval:]

,这将使您的线程完全进入睡眠状态,甚至不会接收操作系统事件。

于 2009-10-22T20:37:58.987 回答