注意:以下更新...
我有一个可可桌面应用程序,它由一系列围绕自定义 NSView 的控件组成。我正在使用 displayLink 来驱动更新。
当用户单击 NSControl(滑块、按钮、复选框、单选按钮)时,应用程序似乎会冻结,直到释放鼠标。事实上,我可以确认 displayLink 回调(getFrameForTime)在此期间没有触发。如果我创建一个也不会触发的计时器,它们都会保持暂停状态,直到用户释放鼠标,此时应用程序会继续更新。
控件已绑定,如果我从另一个线程更新该值(例如,通过来自 MIDI 接口的回调),滑块的行为与预期一样:它移动,值更新并且应用程序不会暂停。
我觉得这应该是一个相当明显的修复,但我很难过。
在 IB 中检查“连续”就像宣传的那样:连续发送值,但在释放鼠标之前仍然表现出这种行为(阻止 UI 更新)。
这似乎与 NSControl 上的 mouseDown 相关?为什么会阻塞,我真的需要子类化我所有的 UI 元素来改变这种行为(似乎很极端)
DisplayLink 是在自己的线程中,那为什么主线程上的 mouseDown 会阻塞呢?如果是这种情况,考虑到从主线程以外的地方更新 Cocoa UI 的禁令,我该如何处理呢?
非常感谢任何帮助。
更新
根据@Nikolai 下面的评论,我可以确认使用 NSTimer 并将其添加到 NSEventTrackingRunLoopMode 不会阻塞。但是,我真的很想使用 CVDisplayLink (根据文档)在它自己的线程中运行并且不应该以这种方式被阻止。与 CADisplayLink 不同,我找不到将运行循环显式分配给 CVDisplayLink 的方法(似乎它不是那样工作的),所以也许新问题应该是:
为什么 CVDisplayLink 会阻塞 NSEventTrackingRunLoopMode?