- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一些关于 NSRunLoop 的问题。当运行如下代码时,主线程似乎停止了,它不会在 while 循环之后运行代码。我想知道什么时候[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]执行后,主线程的运行循环中发生了什么?正如我们所知,UI mainthread'runloop 在应用程序启动时自动运行,主线程是休眠还是死循环?
while (!self.runLoopThreadDidFinishFlag) {
NSLog(@"Begin RunLoop");
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
NSLog(@"End RunLoop");
}
最佳答案
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]
这行代码只是让线程执行一次循环的sources,如果没有任务,就立即返回。所以这些代码不会阻塞你的主线程。 Mainthread 的 runloop 自动运行意味着主线程保持一段时间循环执行 [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]
一次又一次。当它碰到你自己的while圈时while (!self.runLoopThreadDidFinishFlag)
状态可能始终为真,可能会阻塞线程。你自己的代码 [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]
这里的意思是执行一次循环的源代码或在运行循环的源代码中清理任务,如果有一个任务更改self.runLoopThreadDidFinishFlag
然后你的代码将继续。
所以 [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]
在你的while
circle让主线程有机会goto
执行其他可能改变 runLoopThreadDidFinishFlag
的代码.
附言。 [NSRunLoop run]
与 runMode:beforeDate:
非常不同你可能会感到困惑。 NSRunLoop apple document
编辑 20190606。main-runloop(主线程)中 while-loop 的示例代码。
你可以测试一下,如果“runMode:beforeDate:”函数被删除,while循环不能被“停止”按钮停止。所以这里的“runMode:beforeDate:”提供了一个机会在 out big-while-loop(main-runloop) 中运行其他代码。
- (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");
}
}
关于objective-c - "[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]"是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31199802/
我对 NSRunLoop 的 runMode:beforeDate 方法的正确使用有疑问。 我有一个辅助的后台线程,用于处理收到的委托(delegate)消息。 基本上,我有需要在后台线程上执行的进程
正如标题所说,NSRunLoop 的 runMode:beforeDate: 不等待。我应该怎么做才能让线程等待 NSRunLoop。 我正在后台线程上运行一个方法: [self performSel
崩溃发生在以下代码中: void CocoaCommRequest::launchSync() { launchAsync(); while (![_delegate finished
我最近发现,在等待我的 NSURLConnections 通过时,如果我告诉等待的线程去做,它会工作得更好: [[NSRunLoop currentRunLoop] runMode:NSDefault
我的应用程序与 iOS5 b7 和 GM 版本的兼容性有问题。 问题出现在下一行代码中: do { [[NSRunLoop currentRunLoop] runMode:NSDefaultR
我正在尝试通过单元测试对我的应用进行一些压力测试,但遇到了一些问题。下面是我的代码: //Stress test api and core data __block BOOL done = N
在 UIViewController viewDidAppear 事件中,我想从网络服务中获取一些数据。代码如下: - (void)viewDidAppear:(BOOL)animated { [s
我有一些关于 NSRunLoop 的问题。当运行如下代码时,主线程似乎停止了,它不会在 while 循环之后运行代码。我想知道什么时候[[NSRunLoop currentRunLoop] runMo
我是一名优秀的程序员,十分优秀!