如何 运行 在 Cocoa 应用程序的主线程中自定义代码

How to run custom code in the main thread of Cocoa applications

我是一名 windows 开发人员,我很难理解 运行 代码的正确方法 NSApplication 的主线程。

我的大部分代码 运行 在 cvdisplaylink 线程中运行(它是一个 opengl 应用程序) 问题是我无法从它调用 NSOpenPanel 之类的东西 - 它会使应用程序崩溃并警告主线程中只有 运行ning 这样的东西。

没关系,但据我所知,主线程是完全不透明的,我只能让它用事件来做事。 NSApp sendAction 方法听起来很有前途——因为我可以明确指定要调用的方法。但它没有 'send' 任何东西,它只是直接从同一个线程调用了这个方法。

我理解的对吗?我是否必须将某种自定义事件(可能是 NSEventTypeApplicationDefined)推送到主线程队列才能使其正常工作? 如果是这样,我该如何响应这样的自定义事件?

像这样:

dispatch_async(dispatch_get_main_queue(), ^{
   // do whatever
});

如果你想做的是调用 Obj C 对象的方法,老派 Cocoa 方法(仍然有效)是使用 performSelectorOnMainThread:withObject:waitUntilDone:

例如要通过调用其 "orderOut:" 方法来隐藏 window,您可以这样做。

[theWindow performSelectorOnMainThread:@selector(orderOut:) 
                            withObject:nil 
                         waitUntilDone:NO];