CFRunLoopObserver与嵌套CFRunLoops

hid*_*kgb 6 macos cocoa core-foundation

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

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

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

Amy*_*all 2

回避runloop问题,你看过吗CVDisplayLink

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