我在面板中有一个计时器,我试图每秒触发一次,但是我似乎无法启动它。我创造我的面板像这样:NSTimer在工作表窗口中没有触发
// Begin our sheet
[NSApp beginSheet: targetController.window
modalForWindow: self.window
modalDelegate: self
didEndSelector: nil
contextInfo: nil];
然后在我的targetController我有以下几点:
- (void) awakeFromNib
{
NSLog(@"awakeFromNib.");
displayUpdateTimer = [NSTimer timerWithTimeInterval: 1.0
target: self
selector: @selector(updateDisplay:)
userInfo: nil
repeats: TRUE];
[[NSRunLoop currentRunLoop] addTimer: displayUpdateTimer
forMode: NSModalPanelRunLoopMode];
}
我的理解是,我通过与NSModalPanelRunLoopMode
增加计时器正确地这样做,但是,即使这样做,我的updateDisplay:选择器永远不会被解雇。
有没有人有什么我在做什么错在这里?
注意:我也试过NSDefaultRunLoopMode
但它没有区别。计时器还没有被解雇。
编辑:我的总体目标是以下 -
我的面板,可以有许多项目添加到它在同一时间(从多个线程)的表视图。因此,我将这些项目添加到一个临时数组中,然后当计时器触发时,它将临时数组中的项目添加到主数组并重新加载表格。下面是代码这样的样本:
- (void) addOverwriteObject: (id) overwriteObject
{
@synchronized(newObjects)
{
// Add our overwrite object
[newObjects addObject: overwriteObject];
} // End of overwriteObject
} // End of addOverwriteObject
而且方法火灾时,计时器更新:
- (void)updateDisplay:(id)sender
{
@synchronized(newObjects)
{
if(newObjects.count > 0)
{
[overwriteObjects addObjectsFromArray: newObjects];
[newObjects removeAllObjects];
[tableView reloadData];
} // End of newObjects has entries
} // End of newObjects sync
} // End of updateDisplay
不幸的是不定时点火,我在表中得到任何项目都没有。
下面是正是我试图做一个屏幕截图(条目已直接添加到主阵列。)
我的猜测是你可能会得到一个错误的runloop。主循环不能在工作表窗口中工作,它有它自己的一个。确保你没有在awakeFromNib [NSRunLoop currentRunLoop]中获得主循环。如果是这样,我会尝试在awakeFromNib中得到正确的runloop,但是稍后。 – Davyd 2012-01-17 03:54:25
无论如何,你为什么需要模态表中的计时器? – Davyd 2012-01-17 03:55:38
我添加了更多的细节来尝试和解释我正在做什么。此外,我尝试将计时器代码移到windowDidLoad而不是awakeFromNib,但仍然没有运气。 – Kyle 2012-01-17 12:20:02