NSTimer scheduleTimerWithTimeInterval: repeats: метод селектора НЕТ вызывается несколько раз - PullRequest
0 голосов
/ 16 ноября 2011

Я использую NSThread вместе с NSTimer.

Мой код такой:

-(void) checkForRecentAlarm
{
    if ([self.alarmThread isFinished]) 
     {
        [self.alarmThread cancel];
     }
    self.alarmThread = [[NSThread alloc] initWithTarget:self selector:@selector(startTimerForRecentAlarm) object:nil];
    [self.alarmThread start];
    //[NSThread detachNewThreadSelector:@selector(startTimerForRecentAlarm) toTarget:self withObject:nil];
}
-(void)startTimerForRecentAlarm
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    self.recentAlarmTime = [NSDate date];
    self.dbObject = [[RADataBaseModelManager alloc] init];
    self.recentAlarmTime = [self.dbObject getMostRecentAlarmTimeFromDB];
    if (self.recentAlarmTime) {
        NSTimeInterval timeIntervalToAlarm = [self.recentAlarmTime timeIntervalSinceNow];
        NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
         //Fire timer every second to updated countdown and date/time
        self.RATimer = [NSTimer scheduledTimerWithTimeInterval:timeIntervalToAlarm target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:NO];
        [runLoop run];
    }
    [pool release];
}
 - (void)timerFireMethod:(NSTimer*)theTimer
{
    [self.RATimer invalidate];
    [theTimer invalidate];
    self.RATimer = NULL;
    theTimer = NULL;
    [self playAlarm];
    UIAlertView *alarmAlert = [[UIAlertView alloc] initWithTitle:@"Alarm" message:@"" delegate:self cancelButtonTitle:@"Close" otherButtonTitles:@"Snooze", nil]; 
    [alarmAlert show];
    [alarmAlert release];
    alarmAlert = nil;

}

Теперь проблема в том, что мое оповещение приходит дважды за один вызов в методе startTimerForRecentAlarm.Таким образом, предупреждение появляется дважды, и мой взгляд застревает.

В чем здесь проблема?

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

Пожалуйста, помогите.

Когда я отлаживаю это, я могу обнаружить, что много потоков одновременно работают с одним и тем же кодом (UIAlertView).

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Это кажется действительно сложным.Мое общее наблюдение состоит в том, что если вы получаете два срабатывания таймера, то это потому, что по какой-то причине у вас есть два таймера.

Если у вас несколько потоков, выполняющих UIAlertView, у вас есть другая проблема, потому что вы можете (надежно) выполнять толькоосновная нить.

1 голос
/ 16 ноября 2011

Я не вижу какой-либо очевидной причины, почему это будет вызываться дважды, но это кажется слишком сложным способом сделать то, что вам нужно сделать.

Вы думали об использовании localуведомления ?

Если вы не хотите этого делать, вы можете реорганизовать свой код, чтобы он работал следующим образом: 1. Добавьте новое событие 2. Если для события нет таймера или временикороче, чем время на таймере, затем установите таймер для этого события.3. Когда срабатывает таймер, проверьте следующее событие и установите таймер для этого события (если оно есть).

...