Pregunta

He configurado dos temporizadores en mi aplicación que se repiten cada pocos segundos. Todo funciona bien, excepto cuando es hora de invalidar los temporizadores. Cuando el teléfono está bloqueado, quiero invalidar esos temporizadores y luego volver a crearlos cuando el teléfono está desbloqueado.

Estoy usando las notificaciones para saber cuándo invalidar / crear los temporizadores.

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notify_didBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notify_willResigneActive:) name:UIApplicationWillResignActiveNotification object:nil];

Esto es lo que contiene el método notify_didBecomeActive:

clockTicker = [[NSTimer scheduledTimerWithTimeInterval: 1  
                                            target: self  
                                          selector: @selector(showActivity)  
                                          userInfo: nil  
                                           repeats: YES] retain];

alarmTicker = [[NSTimer scheduledTimerWithTimeInterval: CONST_ALARMTIMER  
                                               target: self  
                                             selector: @selector(checkAndLaunchAlarm)  
                                             userInfo: nil  
                                              repeats: YES] retain];

Esto contiene el método notify_willResigneActive:

if (alarmTicker) {
    [alarmTicker invalidate];
    [alarmTicker release];
    alarmTicker = NULL;
}

if (clockTicker) {
    [clockTicker invalidate];
    [clockTicker release];
    clockTicker = NULL;
}

El problema es que cuando depuro esto en la segunda invalidación del temporizador obtengo el error. Lo extraño es que si cambio el orden de los temporizadores (como invalidar primero el clockTicker) ... aún obtengo el error en el segundo temporizador.

¿Qué podría estar haciendo mal?

Gracias Leonardo

¿Fue útil?

Solución

invalidate libera el temporizador, no es necesario liberarlo después de invalidar, por eso se bloquea. Pero acabo de notar que retiene el temporizador ... tampoco estoy seguro de que esto sea necesario.

Otros consejos

Solo necesita configurar alarmTicker y clockTicker en cero dentro de los métodos que activan esos temporizadores y de esa manera cuando verifica si (alarmTicker) o if (clockTicker) tendrán el valor correcto.

No estoy seguro de qué establecer el temporizador en NULL en lugar de establecerlo en nulo, pero sé que si realiza una llamada en un objeto nulo, es un no-op. Si realiza una llamada en un objeto NULL, cree que se bloquea, aunque no he verificado esto. Esta publicación podría ayudar: NULL vs nil en Objective-C

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top