2011-09-07 8 views
5

Sto utilizzando NSTimer nidificato in un'applicazione. Ho due problemi qui.come annullare la pianificazione di NSTimer nell'obiettivo-c

  1. Come reiniziare contatore del tempo in questa funzione - (void)updateLeftTime:(NSTimer *)theTimer
  2. Come uccidere il timer precedente perché - (void)updateLevel:(NSTimer *)theTimer chiede inoltre dal timer.

- (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

uso – Narayana

risposta

17
  • Usa [tmLevel invalidate] per annullare pianificazione di un timer.
  • Non dimenticare di impostare tmLevel=nil subito dopo (per evitare di utilizzare la variabile dopo che il timer è stato programmato e rilasciato dal runloop)
  • Non dimenticare di invalidare il timer tmLevel prima di perdere il riferimento ad essa, vale a dire chiamare [tmLevel invalidate] anche prima di assegnare un nuovo NSTimer alla variabile tmLevel (oppure il timer precedente continuerà a funzionare in aggiunta a quello nuovo)

si noti inoltre che nel codice hai allocazioni inutili che sono inoltre la creazione di un perdita:

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

qui si assegna un'istanza NSTimer, si archivia questa istanza in tmLeftTime ... e quindi si dimentica immediatamente di questa istanza creata per sostituirla con un'altra, creata utilizzando [NSTimer scheduledTimerWithTimeInterval:...]! Pertanto, il NSTimer creato utilizzando [[NSTimer alloc] init] viene perso e sta creando una perdita (poiché non verrà mai rilasciata).

La prima linea è del tutto inutile, è un po 'come si stava facendo metodo invalidate

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

aggiungere le seguenti righe quando u vuole azzerare il timer

[tmLeftTime invalidate]; 
tmLeftTime = nil; 

è anche possibile utilizzare

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

ne dite di usare un solo timer invece di 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

invalidare la timer con il metodo invalidate nella vostra updateLevel: Metodo e ri-programmare lo stesso timer.

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

E se si desidera chiamare l'updateTimeLeft: metodo che non c'è bisogno di alloc un altro timer, che è una grande perdita dal momento che non si è mai rilasciare tali riferimenti.

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

E nel tuo updateTimeLeft: appena ri-programmare il metodo del timer e impostare una condizione in cui dovrebbe fermarsi.

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

Oh! Ho capito, ma in realtà sono ancora a posto, quindi il codice non è corretto, devo riprenderlo dopo il completamento di un livello e un livello ha 20 domande. Dopo il completamento di un livello devo mostrare un annuncio.quindi in questo modo devo riavviarlo. Grazie mille –