2012-08-30 12 views
6

Non voglio creare l'oggetto NSTimer. Come si annulla il timer? Voglio invalidare il timer in viewWillDisappear.Come invalido il timer quando non creo l'oggetto NSTimer

-(void) viewDidLoad 
{ 
[super viewDidLoad]; 
[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES]; 
} 
+0

Cosa intendi per * Non voglio creare oggetto NSTimer *? Ne crei già uno usando 'scheduledTimerWithTimeInterval'. – sch

+0

Intendo dire che non tengo il timer che creo. È possibile? – Voloda2

risposta

3

Un

si deve mantenere il timer si crea:

@interface MONObject() 
@property (nonatomic, retain) NSTimer * timerIvar; 
@end 

@implementation MONObject 
... 
- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
self.timerIvar = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES]; 
} 

- (void)invalidateTimer 
{ 
    [self.timerIvar invalidate]; 
    self.timerIvar = nil; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    ... 
    [self invalidateTimer]; 
} 

B

un'altra opzione sarebbe quella di invalidare il timer che viene passato nella richiamata, ma ciò non si verifica entro viewDidUnload:. Pertanto, non del tutto applicabile in questo scenario:

- (void)onTimer:(NSTimer *)pTimer 
{ 
    [pTimer invalidate]; 
} 
0

Forse questo metodo può aiutare a:

[self performSelector:@selector(onTimer:) withObject:nil afterDelay:10]; 
1

Se si vuole essere in grado di annullare il timer, si deve fare riferimento alla timer che stai cancellando, e questo significa che devi mantenere il puntatore sul timer in giro, vedere la risposta di Justin.

Mantenere un riferimento al timer è il modo giusto per farlo, ma per ragioni di completezza è possibile utilizzare anche il metodo -performSelector:withObject:afterDelay: come timer di un uomo povero. La chiamata potrebbe essere invalidata utilizzando +cancelPreviousPerformRequestsWithTarget:. Esempio di codice:

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self performSelector:@selector(timerTick) withObject:nil afterDelay:10]; 
} 

E poi:

- (void) viewWillDisappear 
{ 
    [NSObject cancelPreviousPerformRequestsWithTarget:self]; 
    [super viewWillDisappear]; 
} 

Ma questo non è il modo giusto per farlo, perché ci potrebbero essere altre richieste eseguire-selettore in attesa sul vostro oggetto che si sarebbe annullare. È meglio tenere il timer in giro, in questo modo sai esattamente cosa stai cancellando.

A proposito, è anche probabilmente una cattiva idea eseguire un timer in -viewDidLoad. Visualizza il caricamento può accadere in qualsiasi momento, senza alcuna relazione alla visualizzazione visualizzata.

0

Se non si desidera mantenere il timer, l'oggetto NSTimer verrà passato al metodo timer (nel tuo caso onTimer :), quindi in tale metodo è possibile verificare se il timer è ancora necessario e invalidare esso. Tuttavia, si verificherà un problema se la visualizzazione ritorna prima di aver invalidato il timer e ne si crea uno nuovo.

Il modo migliore è di memorizzare il timer in una variabile di istanza. Funziona, nessun trucco intelligente, e saprai sei mesi dopo quello che hai fatto. Probabilmente mi scrivo un getter

@property (readwrite, nonatomic) BOOL hasTimer; 

ritorna SI se e solo se il timer non è pari a zero, setter invalida il timer o ne crea una nuova.