Domanda

Ho installato due timer nella mia applicazione che si ripetono entrambi ogni pochi secondi. Tutto funziona bene tranne quando è il momento di invalidare i timer. Quando il telefono è bloccato, voglio invalidare quei timer e poi ricrearli quando il telefono è sbloccato.

Sto usando le notifiche per capire quando invalidare / creare i timer.

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

Questo è ciò che contiene il metodo 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];

Questo contiene il metodo notify_willResigneActive contenente:

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

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

Il problema è che quando debug questo sul secondo timer invalido ottengo l'errore. La cosa strana è che se cambio gli ordini dei timer (come prima invalidare l'orologioTicker) .. Ho ancora l'errore sul secondo timer.

Cosa potrei fare di sbagliato?

Grazie, Leonardo

È stato utile?

Soluzione

invalidate rilascia il timer, non è necessario rilasciare dopo l'invalidazione, ecco perché si blocca. Ma ho appena notato che stai mantenendo il timer ... non sono sicuro che questo sia necessario.

Altri suggerimenti

Devi solo impostare alarmTicker e clockTicker su zero all'interno dei metodi che quei timer attivano e in quel modo quando controlli se (alarmTicker) o se (clockTicker) avranno il valore giusto.

Non sono sicuro di cosa significhi impostare il timer su NULL invece di impostarlo su zero, ma so che se si effettua una chiamata su un oggetto nil, è una no-op. Se si effettua una chiamata su un oggetto NULL, si ritiene che si blocchi, sebbene non sia stato verificato. Questo post potrebbe essere d'aiuto: NULL vs nil in Objective-C

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top