2

我在面板中有一个计时器,我试图每秒触发一次,但是我似乎无法触发它。我正在创建我的面板,如下所示:

// 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

不幸的是,如果没有计时器触发,我在表中根本没有任何条目。

下面是我正在尝试执行的操作的屏幕截图(条目已直接添加到主数组中。)

在此处输入图像描述

4

1 回答 1

0

您的代码似乎是正确的,运行循环可能存在问题。尝试使用 scheduleTimerWithTimeInterval:target:selector:userInfo:repeats:。

于 2012-01-17T08:20:47.580 回答