objective-c - 停止 NSApplication 主事件循环

标签 objective-c cocoa nsapplication

我有一个由以下单个 .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 ,但这太快退出程序了。我还尝试设置一个实现 applicationShouldTerminateNSApplicationDelegate,但这从未被调用。

如何确保主运行循环(干净地)退出?

注意:共享应用程序主循环是必要的,因为 UI 工作正在其他地方完成。更具体地说,这在Go WDE中给出了问题。 UI 库,它使用 Cocoa 为 Go 应用程序提供一个窗口。

最佳答案

documentation for -stop:说:

[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/

相关文章:

ios - 使用自动布局调整 UIImageView 的大小

objective-c - 无法让雅可比算法在 Objective-C 中工作

cocoa - 在正在运行的应用程序中更改 NSApplicationIcon?

iphone - 在 cocoa 中返回一个数组,但等待委托(delegate)完成

objective-c - isEqualToString 始终返回 true

ios - 在 Xcode 6.1 的 plcrashreporter 中使用未声明的标识符 UNWIND_ARM64_MODE_FRAME_OLD

java - MVC 架构的最新技术水平?

objective-c - NSManagedObjectContext 具有不同的进程

objective-c - NSApplication endSheet : has no effect

Cocoa NSApplication 未激活但正在接收鼠标事件