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

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

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

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

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

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

【问题讨论】:

    标签: ios multithreading macos cocoa-touch cocoa


    【解决方案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 代码中。感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 2021-08-07
    • 2010-12-02
    • 1970-01-01
    • 2021-10-07
    • 2019-10-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多