如何 运行 在 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];
我是一名 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];