我有一些关于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"); }
答案 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