向 Cocoa 应用程序的主事件循环发布消息?

Posted

技术标签:

【中文标题】向 Cocoa 应用程序的主事件循环发布消息?【英文标题】:Post a message to the main event loop of a Cocoa application? 【发布时间】:2013-06-23 21:47:08 【问题描述】:

比方说,在我的 GUI 应用程序(它可以跨 OSX/ios 移植)中,我有多个线程可以向主应用程序线程发送通知。通知应该在处理 Cocoa 的输入事件和重绘请求的同一上下文中处理。我的目标是在屏幕上反映来自并发线程的某些事件。

在 Windows 上有 PostMessage(),那么它在 OS X 和 iOS 上的模拟是什么?

dispatch_async() 似乎是一个很好的候选者,但是,文档说:

目标队列确定块是串行调用还是 同时针对提交给同一区块的其他区块 排队。

老实说,这只会造成混乱。此外,尚不清楚哪个消息队列与dispatch_async 一起使用,以便针对 GUI 事件串行处理消息。

【问题讨论】:

【参考方案1】:

你是对的 dispatch_async 是要走的路。您应该寻找的队列是主队列:

dispatch_async(dispatch_get_main_queue(), ^
    NSLog(@"Got to main thread.");
);

【讨论】:

就像我在另一条评论中所说,我喜欢块,但不知何故,我发现 performSelectorOnMainThread 的方法更优雅,更好地“融合”到 ObjC 代码中。所以我会接受另一个答案,但谢谢你的回答!【参考方案2】:

在 OS X 上更老式的方法是 NSObject 方法performSelectorOnMainThread:withObject:waitUntilDone:。我希望它也可以在 iOS 上运行。

【讨论】:

我喜欢块,但不知何故,我发现这种方法更优雅,更好地“融合”到 ObjC 代码中。感谢您的回答!

以上是关于向 Cocoa 应用程序的主事件循环发布消息?的主要内容,如果未能解决你的问题,请参考以下文章

js异步——事件循环和消息队列

Cocoa Touch:App运行机制 NSRunLoop, KVC, KVO, Notification, ARC

如何在 Qt 的主事件循环中使用 std::thread?

NSDocument 向 NSViewControllers 发送事件的标准方式是啥?

Cocoa:访问事件队列?

如何将应用程序定义的消息发送到 SDL 中的事件循环?