我有一个由以下单个 .m
文件组成的应用程序:
#import <Cocoa/Cocoa.h>
int main(int argc, char* argv[]) {
[[[NSThread alloc] initWithBlock: ^{
sleep(2);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Stop");
[[NSApplication sharedApplication] stop:nil];
});
}] start];
[[NSApplication sharedApplication] run];
NSLog(@"Run finished");
return 0;
}
根据the developer documentation , stop
应该停止主循环 (run
),但它没有(至少在 OS X 10.12 和 10.13 上没有)。还有terminate
,但这太快退出程序了。我还尝试设置一个实现 applicationShouldTerminate
的 NSApplicationDelegate
,但这从未被调用。
如何确保主运行循环(干净地)退出?
注意:共享应用程序主循环是必要的,因为 UI 工作正在其他地方完成。更具体地说,这在Go WDE中给出了问题。 UI 库,它使用 Cocoa 为 Go 应用程序提供一个窗口。
最佳答案
[C]alling this method from a timer or run-loop observer routine would not stop the run loop because they do not result in the posting of an NSEvent object.
调度到主队列的 block 类似,因为它不发布事件。您可以尝试在调用 -stop:
后发布 NSEventTypeApplicationDefined
事件。
关于objective-c - 停止 NSApplication 主事件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48041279/