CFRunLoopObserver与嵌套CFRunLoops

时间:2017-02-25 19:27:29

标签: macos cocoa core-foundation

我有一个Cocoa UI应用程序,需要像其他UI事件循环许可一样快地更新其主窗口,所以我通过CFRunLoopObserver实现了主更新程序功能。我还有一个应用程序模式警报框和一个上下文菜单。

所以,我的问题是,当我在屏幕上同时显示警报和上下文菜单时,更新程序会被卡住,可能是由于嵌套的运行循环数量超过了它在开始时附加到它上面的数量。令人惊讶的是,我可以通过复制观察者来缓解这个问题,并且它一直在运行 - 只有一个实例,从«blocking»嵌套循环开始时从现有的两个实例中随机选择。当它结束时(选择一个菜单项,警报超过其超时或手动解除 - 无论如何),事情恢复正常,被阻止的观察者恢复运行的能力。

现在的问题是:有没有办法让一个观察者被执行,无论运行循环堆栈有多深?

1 个答案:

答案 0 :(得分:2)

避开runloop问题,你看过CVDisplayLink吗?

您使用CVDisplayLinkCreateWithActiveCGDisplays()设置一个,然后使用CVDisplayLinkSetOutputCallback()附加回调。它会以显示器的刷新率询问数据,因此您可以根据需要快速获得回调。