Резьбовой NSTimer - PullRequest
       15

Резьбовой NSTimer

1 голос
/ 01 июля 2010

Мне известно о многих вопросах, касающихся этой темы, поскольку я сам задавал один вопрос ранее, однако теперь моя проблема, по-видимому, больше связана с частью потоков. У меня есть следующие 2 метода.

-(void) restartTimer {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1. 
                                             target:self
                                           selector:@selector(dim) 
                                           userInfo:nil 
                                            repeats:YES];
    time = 31;
    NSLog(@"calling restart timer");
    [self performSelectorOnMainThread:@selector(timerImageUpdate) withObject:nil waitUntilDone:NO];

    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];

    [pool drain];

}

-(void) resumeTimer {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1. 
                                             target:self
                                           selector:@selector(dim) 
                                           userInfo:nil 
                                            repeats:YES];
    NSLog(@"calling resume timer");

    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];

    [pool drain];

}

Функция restartTimer вызывается, когда начинается игра. Это работает отлично, и таймер красиво запускает тусклый селектор. Проблема возникает, когда пользователь нажимает мою кнопку пропуска в быстрой последовательности. [пропустить] обновляет MKMapView и в методе делегата mapdid, для которого выполняется загрузка, вызывается следующим образом: [NSThread detachNewThreadSelector: @selector (restartTimer) toTarget: self withObject: nil];
Когда это происходит, кажется, что создано несколько таймеров, и, таким образом, моя функция диммирования вызывается слишком часто, создавая впечатление, что одиночный таймер работает очень быстро? Каков наилучший способ запустить и перезапустить таймер, используя вторичный поток? Обратите внимание, что эта проблема возникает только в том случае, если кнопка пропуска нажимается многократно и быстро, тогда как она работает нормально, если просто нажимать время от времени?

У кого-нибудь есть идеи? Большое спасибо

Jules

1 Ответ

0 голосов
/ 01 июля 2010

Вы можете использовать bool, чтобы узнать, работает ли у вас таймер или нет. Когда вы запускаете таймер, вы устанавливаете его в true, когда вы останавливаете таймер, вы устанавливаете его в false. Когда вызывается функция таймера возобновления, вы проверяете эту переменную, и если она истинна, вы не запускаете новый таймер.

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

...