2011-09-07 6 views
5

Estoy usando NSTimer anidado en una aplicación. Tengo dos problemas aquí.cómo deshabilitar NSTimer en objetivo-c

  1. Cómo volver a iniciar el contador de tiempo en esta función - (void)updateLeftTime:(NSTimer *)theTimer
  2. Cómo matar temporizador anterior debido - (void)updateLevel:(NSTimer *)theTimer también está llamando por temporizador.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    tmLevel=[NSTimer scheduledTimerWithTimeInterval:20.0f target:self selector:@selector(updateLevel:) userInfo:nil repeats:YES]; 

    tmLeftTime=[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES]; 
} 

- (void)updateLevel:(NSTimer *)theTimer { 
    static int count = 1; 
    count += 1; 

    lblLevel.text = [NSString stringWithFormat:@"%d", count]; 

    tfLeftTime.text=[NSString stringWithFormat:@"%d",ANSWER_TIME]; 

    tmLeftTime=[[NSTimer alloc] init]; 
    tmLeftTime=[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES]; 
    [self playMusic]; 

} 
- (void)updateLeftTime:(NSTimer *)theTimer { 
    static int timeCounter=1; 
    timeCounter+=1; 
    tfLeftTime.text=[NSString stringWithFormat:@"%d", (ANSWER_TIME-timeCounter)]; 
} 
+1

el uso del método de invalidación – Narayana

Respuesta

17
  • Uso [tmLevel invalidate] para cancelar la programación de un temporizador.
  • No se olvide de establecer tmLevel=nil inmediatamente después (para evitar el uso de la variable después de que el temporizador ha sido programado y puesto en libertad por el Runloop)
  • No se olvide de invalidar el temporizador tmLevel antes de perder la referencia a la misma, a saber, llamar [tmLevel invalidate] también antes de asignar una nueva NSTimer a la variable tmLevel (o de lo contrario el temporizador anterior continuará funcionando, además de la nueva)

tenga en cuenta también que en su código que tiene asignaciones inútiles que están creando, además, una fuga:

tmLeftTime=[[NSTimer alloc] init]; 
tmLeftTime=[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES]; 

aquí usted asigna una instancia de NSTimer, almacena esta instancia en tmLeftTime ... y luego olvida inmediatamente esta instancia creada para reemplazarla por otra, creada usando [NSTimer scheduledTimerWithTimeInterval:...]! Por lo tanto, el NSTimer creado usando [[NSTimer alloc] init] se pierde y está creando una fuga (ya que nunca se lanzará).

Su primera línea es totalmente inútil, es un poco como que estaba haciendo

int x = 5; 
x = 12; // of course the value "5" is lost, replaced by the new value 
11

añadir las siguientes líneas cuando u desea restablecer el temporizador

[tmLeftTime invalidate]; 
tmLeftTime = nil; 

también se puede utilizar

if ([tmLeftTime isValid]){ 
    // the timer is valid and running, how about invalidating it 
    [tmLeftTime invalidate]; 
    tmLeftTime = nil; 
} 
0

Cómo sobre el uso solamente a un temporizador en lugar de 3 ?

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    tmLeftTime=[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES]; 
} 

- (void)updateLevel { 
    static int count = 1; 
    count += 1; 

    lblLevel.text = [NSString stringWithFormat:@"%d", count]; 

    tfLeftTime.text=[NSString stringWithFormat:@"%d",ANSWER_TIME]; 

    [self playMusic]; 

} 
- (void)updateLeftTime:(NSTimer *)theTimer { 
    static int timeCounter=1; 
    timeCounter+=1; 
    tfLeftTime.text=[NSString stringWithFormat:@"%d", (ANSWER_TIME-timeCounter)]; 
    if (timeCounter >= ANSWER_TIME) { 
     timeCounter = 0; 
     [self updateLevel]; 
    } 
} 
0

invalidar su temporizador con el método de invalidación en su updateLevel: método y reprogramar el mismo temporizador.

[tmLevel invalidate]; 
tmLevel = [NSTimer scheduledTimerWithTimeInterval:20.0f target:self selector:@selector(updateLevel:) userInfo:nil repeats:YES]; 

Y si quieres llamar a la updateTimeLeft: método que no es necesario alloc otro temporizador, que es una gran fuga ya que nunca se está liberando esas referencias.

tmLeftTime = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES]; 

Y en su updateTimeLeft: acaba de volver a programar el método del contador de tiempo y establecer una condición donde debe parar.

tmLeftTime = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES]; 
+0

Oh! Entendí, pero en realidad todavía estoy en medio, así que el código no es correcto, tengo que reanudarlo después de completar un nivel y un nivel tiene 20 preguntas. Después de completar un nivel, tengo que mostrar un anuncio.así que de esta manera tengo que reiniciarlo. Muchas gracias –