什么“[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]”做什么?

时间:2015-07-03 06:18:37

标签: objective-c multithreading nsthread nsrunloop

我有一些关于NSRunLoop的问题。当运行如下代码时,主线程似乎停止,并且它不会在while循环之后运行代码。 我想知道什么时候 [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]] 执行,在mainthread的runloop中发生了什么?我们知道UI mainthread'runloop在应用程序启动时自动运行,主线程是否正在睡眠或处于死循环中?

while (!self.runLoopThreadDidFinishFlag) {
    NSLog(@"Begin RunLoop");

    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

    NSLog(@"End RunLoop");
}

1 个答案:

答案 0 :(得分:3)

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]

这行代码只让线程执行循环源一次,如果没有任务,它会立即返回。所以这些代码不会阻塞你的主线程.Mainthread的runloop自动运行意味着主线程保持一个圆圈一次又一次地执行[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]。当它在圈while (!self.runLoopThreadDidFinishFlag)中运行时,状态可能始终为true,可能会阻塞该线程。你自己的代码[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]在这里意味着执行循环源一次或清理runloop源中的任务,如果有一个任务更改self.runLoopThreadDidFinishFlag那么你的代码将继续。

因此[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]圈中的while使得主线程有机会goto执行可能会更改runLoopThreadDidFinishFlag的其他代码。

PS。  [NSRunLoop run]与您可能感到困惑的runMode:beforeDate:非常不同。 NSRunLoop apple document