Cocoa 运行NSRunLoop会导致主线程挂起
在Cocoa应用程序中,运行如下代码:Cocoa 运行NSRunLoop会导致主线程挂起,cocoa,freeze,nsrunloop,Cocoa,Freeze,Nsrunloop,在Cocoa应用程序中,运行如下代码: NSDate* date = [NSDate dateWithTimeIntervalSinceNow:30.0]; while (date.timeIntervalSinceNow > 0) { [NSRunLoop.currentRunLoop runMode:NSDefaultRunLoopMode beforeDate:date]; } 在主线程上,会导致主线程挂起30秒。我觉得这很令人惊讶,因为我认为代码基本上是一个消息泵,允许用
NSDate* date = [NSDate dateWithTimeIntervalSinceNow:30.0];
while (date.timeIntervalSinceNow > 0) {
[NSRunLoop.currentRunLoop runMode:NSDefaultRunLoopMode beforeDate:date];
}
在主线程上,会导致主线程挂起30秒。我觉得这很令人惊讶,因为我认为代码基本上是一个消息泵,允许用户界面事件被实际处理。
人们可以提供什么解释来解释为什么这会导致主线程挂起?主Cocoa应用程序事件循环构建在运行循环之上,但它不仅仅是运行循环输入源 如果需要消息泵,应使用
-nexteventmachingmask:…
和-sendEvent:
应用程序的方法或NSWindow
但是,你真正想要实现的是什么?为什么要尝试运行事件循环30秒?你能用定时器或dispatch\u after()
实现你想要的吗?实际上需要使程序挂起一段时间,有人使用run循环完成了这一点。我对他们是如何做到这一点感到困惑,因为我认为运行循环实际上会阻止应用程序挂起。