2012-08-30 9 views
6

No quiero crear el objeto NSTimer. ¿Cómo invalido el temporizador? Quiero invalidar el temporizador a la vista Va a desaparecer.Cómo invalidar el temporizador cuando no creo el objeto NSTimer

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

¿Qué quiere decir con * No quiero crear el objeto NSTimer *? Ya creas uno usando 'scheduledTimerWithTimeInterval'. – sch

+0

Quiero decir que no tengo el temporizador que creo. ¿Es posible? – Voloda2

Respuesta

3

Un

hay que aferrarse al cronómetro que crear:

@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

otra opción sería la de invalidar el contador de tiempo que se pasa en la devolución de llamada, pero eso no ocurrirá dentro de viewDidUnload:. por lo tanto, no acaba de aplicar en este escenario:

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

Tal vez este método puede ayudarle a:

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

Si usted quiere ser capaz de cancelar el temporizador, hay que referirse a la el temporizador que está cancelando, y eso significa que tiene que mantener el puntero del temporizador, ver la respuesta de justin.

Mantener una referencia al temporizador es la manera correcta de hacerlo, pero para completar, también puede utilizar el método -performSelector:withObject:afterDelay: como temporizador de un hombre pobre. Esa llamada puede invalidarse usando +cancelPreviousPerformRequestsWithTarget:. Código de ejemplo:

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

Y luego:

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

Pero esta no es la forma correcta de hacerlo, porque puede haber otras solicitudes pendientes-selector realizar en el objeto que se cancelaría. Lo mejor es mantener su temporizador, de esa forma usted sabe exactamente lo que está cancelando.

Por cierto, también es probable que sea una mala idea ejecutar un temporizador en -viewDidLoad. La carga de la vista puede realizarse en cualquier momento, sin que se visualice ninguna relación con la vista.

0

Si no desea aferrarse a su temporizador, el objeto NSTimer se pasará al método del temporizador (en su caso onTimer :), por lo que en ese método podría verificar si el temporizador sigue siendo necesario e invalidar eso. Sin embargo, tendrá problemas si la vista vuelve antes de que invalide el temporizador y cree uno nuevo.

De lejos, la mejor manera es almacenar el temporizador en una variable de instancia. Funciona, no hay trucos inteligentes, y sabrás seis meses después de lo que hiciste. Probablemente me escribo un captador

@property (readwrite, nonatomic) BOOL hasTimer; 

devuelve SÍ si y sólo si el temporizador no es nula, organismo invalida el temporizador o crea una nueva.