NSTimer в листовом окне не стреляет - PullRequest
2 голосов
/ 17 января 2012

У меня в панели есть таймер, который я пытаюсь запустить каждую секунду, однако я не могу заставить его срабатывать.Я создаю свою панель следующим образом:

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

К сожалению, без срабатывания таймера я не получаю записей в таблице

Ниже приведен скриншот того, что я пытаюсь сделать (записи были добавлены непосредственно в основной массив.)

enter image description here

1 Ответ

0 голосов
/ 17 января 2012

Ваш код кажется правильным, возможно, проблема с циклом выполнения. Попробуйте использовать scheduleTimerWithTimeInterval: target: selector: userInfo: repeat:.

...