Неправильное поведение NSTimer в отдельном потоке - PullRequest
2 голосов
/ 24 мая 2011

Я пытаюсь запланировать NSTimer в отдельном потоке, и вот как я это делаю.

-(void) startSpinner {
#ifdef DEBUG_MODE
    NSLog(@"Starting Spinner...");
#endif
    self.spinnerThread = [[[NSThread alloc] initWithTarget:self selector:@selector(scheduleSpinner) object:nil] autorelease];
    [spinnerThread start];
}

-(void) scheduleSpinner {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSTimer *_spinTimer = [NSTimer scheduledTimerWithTimeInterval:SPIN_FIRE_INTERVAL target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES];
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    [runLoop addTimer:_spinTimer forMode:NSRunLoopCommonModes];
    [runLoop addTimer:_spinTimer forMode:UITrackingRunLoopMode];
    [runLoop run];

    [pool release];
}

timerFireMethod вращает мой счетчик, и когда нажимается кнопка (кнопка остановки), я отменяю таймери выйти из потока в этом методе.Я делаю опрос здесь, если нажата кнопка вращения.

Проблема в том, что мой timerFireMethod впервые вызывается правильно.Spinner вращается впервые.Но когда я останавливаю свой счетчик и запускаю его снова, счетчик не вращается.Журналы говорят, что во второй раз мой метод "startSpinner" вызывается, но метод "timerFireMethod" не вызывается.

Хуже всего то, что спиннер работает на симуляторе 5-6 раз, 1 раз на устройстве 2g, 4-5 раз на последнем Ipod.Это случайно.

Как это в основном работает?В чем может быть проблема?

1 Ответ

0 голосов
/ 24 мая 2011

Сделайте вашу NSTimer переменную экземпляра классовой переменной.Когда вы сделаете его недействительным, сразу установите его на nil.

...