2011-03-04 1 views
3
[NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:NO]; 

Если повторы: установлено значение НЕТ, нужно ли аннулировать таймер внутри указанного селектора?(iphone) Мне нужно аннулировать таймер при повторах: нет?

Спасибо вы

Редактировать

Другой вопрос, если он самостоятельно аннулирует,

Как вы правильно отменить такой таймер?
Поскольку аннулирование уже недействительного таймера может привести к сбою, я предполагаю?

сохранить указатель на таймер и установить его на нуль внутри селектора, который будет запущен?

ответ

6

Нет, таймер аннулирует себя

+0

спасибо. то http://stackoverflow.com/questions/1429571/how-to-stop-nstimer-event этот код должен на самом деле где-то сохранить таймер, чтобы правильно отменить таймер, я думаю? так как недействительный таймер с автоматическим недействительным приведет к сбою? – eugene

+0

см. Мое редактирование, пожалуйста, – eugene

+0

, если это не повторяющийся таймер (повторяет: нет), нет необходимости отменить таймер. Таймер недействителен и освобождается. Для повторного таймера вам необходимо поддерживать ссылку на таймер, чтобы явно вызвать invalidate. – Kai

0

Если повторы является ДА, то таймер будет повторно перепланировать себя до тех пор, пока недействителен. Если НЕТ, таймер будет недействителен после его срабатывания.

1

@Eugene если вы используете

[NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:YES]; 

затем в методе селекторного вам нужно дать функцию как этот

- (void)timerFireMethod:(NSTimer*)theTimer 

поэтому, когда вы хотите, чтобы аннулировать его, вы можете иметь условие как этот

if(workDone == YES) 
{ 
    [theTimer invalidate]; 
} 

Но если вы используете NO в опции повтора, то таймер аннулирует себя.

1

Вы можете сохранить флаг, чтобы сохранить, был ли запущен таймер или нет.

например.

BOOL gameOver = NO; 
    NSTimer * gameOverTimer; 


-(void)startGame 
{ 

    gameOverTimer = [NSTimer scheduledTimerWithTimeInterval:600 target:self selector:@selector(stopLevel:) userInfo:nil repeats:NO]; 
    // your code 
} 

-(void)stopLevel:(id)sender 
{ 
    gameOver = YES; 
    // your code 
} 

-(void)levelFinishedSuccesfully 
{ 
    // this method will get called if user finishes the level before your timer ends/stops the level. So the timer is valid and we need to invalidate it 
    if(!gameOver) 
    { 
      [gameOverTimer invalidate]; 
      gameOverTimer = nil; 
    }  
     // your code 
} 

Надеюсь, это поможет.

0

вам не хватает, чтобы добавить источник таймера к вашему runloop

ADDTimer: forMode:

Смежные вопросы