如何确保NSTimer始终在NSView中运行?

时间:2011-01-11 05:25:16

标签: cocoa nsview nstimer

我在自定义NSTimer中有一个NSView。计时器设置为始终以特定间隔重复,一旦触发,计时器应更新一组视图参数。

这一切都很好但是,当视图失焦时(即右键单击工具栏以拉出菜单),计时器会延迟,并且在视图失焦时不会触发。

我的问题是,即使视图失焦,我如何确保计时器始终触发并更新视图参数?

2 个答案:

答案 0 :(得分:4)

当您执行某些事件(例如显示上下文菜单)时,运行循环将进入事件跟踪模式。这意味着只会处理某些事件。要在运行循环处于此模式时触发计时器,请在计时器的模式列表中包含NSEventTrackingRunLoopMode。

NSTimer *timer = [NSTimer timerWithTimeInterval:theInterval target:theTarget selector:theSelector userInfo:theUserInfo repeats:shouldRepeat];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSEventTrackingRunLoopMode];

答案 1 :(得分:0)

一个可能的解释:

计时器触发,事件按时添加到队列中。但是,AppKit的大部分都不是线程安全的......所以直到下一次运行循环迭代才会看到更新。哇,事件被阻止,因为事件都通过主运行循环/线程传输。

有意义吗?

注意:为了使问题更加复杂,异步绘图对于OS x来说是相当新的(在NSView级别),因此请确保测试要支持的操作系统的所有主要版本。结果/行为会有所不同。