Objective c 什么是;[[NSRunLoop currentRunLoop]运行模式:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];做

Objective c 什么是;[[NSRunLoop currentRunLoop]运行模式:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];做,objective-c,multithreading,nsthread,nsrunloop,Objective C,Multithreading,Nsthread,Nsrunloop,我对nsrunlop有一些问题。当按如下方式运行代码时,主线程似乎停止了,并且在while循环之后不会运行代码。 我想知道什么时候 [[NSRunLoop currentRunLoop]运行模式:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]] 已执行,在主线程的运行循环中会发生什么?正如我们所知,UI主线程的runloop在应用程序启动时自动运行,主线程是处于休眠状态还是处于死循环中 这行代码只让线程执行一次循环的源代码,如果没有任

我对nsrunlop有一些问题。当按如下方式运行代码时,主线程似乎停止了,并且在while循环之后不会运行代码。 我想知道什么时候 [[NSRunLoop currentRunLoop]运行模式:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]] 已执行,在主线程的运行循环中会发生什么?正如我们所知,UI主线程的runloop在应用程序启动时自动运行,主线程是处于休眠状态还是处于死循环中

这行代码只让线程执行一次循环的源代码,如果没有任务,它会立即返回。所以这些代码不会阻塞主线程。主线程的runloop自动运行意味着主线程保持一个while循环,以便反复执行
[[NSRunLoop currentRunLoop]运行模式:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]
。当它运行到您自己的while循环
while(!self.runloopthreaddidfishflag)
时,状态可能始终为true,这可能会阻止线程。您自己的代码
[[NSRunLoop currentRunLoop]运行模式:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]
这里的意思是执行一次循环的源代码或清除运行循环源代码中的任务,如果有一个任务更改
self.runLoopThreadDiFinishFlag
,则代码将继续

因此,在
循环中
[[NSRunLoop currentlunloop]runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]
使主线程有机会
转到
执行可能更改
runLoopThreadDidFinishFlag的其他代码

附言。
[nsrunlop run]
运行模式:beforeDate:
非常不同,您可能会感到困惑


编辑20190606。主运行循环(主线程)中while循环的示例代码

如果删除了“runMode:beforeDate:”函数,则可以测试“停止”按钮无法停止while循环。所以这里的“runMode:beforeDate:”提供了在out big while循环(主runloop)中运行其他代码的机会


“您的while循环使主线程有机会执行其他可能更改runLoopThreadDidFinishFlag的代码”是什么意思?我以为主线程被阻塞,直到主runloop中有输入源要处理,从而最终更改了该标志?@slow Yes。我在原始答案中添加了一些示例代码。我将“beforeDate”更改为当前日期,这样我们的while循环可以正常工作,并且可以随时启动和停止。
while (!self.runLoopThreadDidFinishFlag) {
    NSLog(@"Begin RunLoop");

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

    NSLog(@"End RunLoop");
}
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]
- (IBAction)stopMyLoop:(id)sender {
    self.runLoopThreadDidFinishFlag = YES;
    NSLog(@"stopMyLoop");
}

- (IBAction)startMyLoop:(id)sender {
    NSLog(@"startMyLoop");
    self.runLoopThreadDidFinishFlag = NO;
    while (!self.runLoopThreadDidFinishFlag) {
        NSLog(@"Begin RunLoop");
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate date]];
        NSLog(@"End RunLoop");
    }
}