2012-06-15 24 views
28

Ho creato un'applicazione di test con il timer prima di implementarla nel mio progetto. Era la prima volta che usavo il timer. Ma il problema è quando ho implementato il timer usando [NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];, non funziona. Ecco il mio codice, Interfaccia:NSTimer timerWithTimeInterval: non funzionante

@interface uialertViewController : UIViewController 
{ 

    NSTimer *timer; 
} 

-(void)displayAlert; 
-(void)hideandview; 
@end 

Implementazione:

@implementation uialertViewController 
- (void)viewDidLoad { 

    [self displayAlert]; 
    [super viewDidLoad]; 
} 


-(void)displayAlert{ 

    timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(hideandview) userInfo:nil repeats:NO]; 

    alert = [[UIAlertView alloc] initWithTitle:@"testing" message:@"hi hi hi" delegate:nil cancelButtonTitle:@"continue" otherButtonTitles:nil]; 
    [alert show]; 




    [alert release]; 
    alert = nil; 

} 

-(void)hideandview{ 

    NSLog(@"triggered"); 

    [alert dismissWithClickedButtonIndex:0 animated:YES]; 

    [alert release]; 

    [self displayAlert]; 
} 

@end 

poi ho cambiato[NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];con[NSTimer scheduledTimerWithTimeInterval: target: selector:userInfo: repeats: ];, si sta lavorando. Quale è stato il problema con timerWithTimeInterval:? Sto valutando qualcosa nella mia prima implementazione? Grazie in anticipo.

+0

timerWithTimeInterval crea il timer ma non lo avvia e pianifica ... lo fa. Penso che questa sia l'unica differenza – rooster117

+0

@ rooster117: allora ho bisogno di chiamare il metodo di fuoco dei timer, sono corretto? –

+0

Sì o basta chiamare scheduleTimerWithTimeInterval quando si desidera avviarlo. In entrambi i casi – rooster117

risposta

115

scheduledTimerWithTimeInterval:invocation:repeats: e scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: creare temporizzatori che vengono automaticamente aggiunti a un NSRunLoop, il che significa che non c'è bisogno di aggiungere voi stessi. Averli aggiunti a un NSRunLoop è ciò che li induce a sparare.

Con timerWithTimeInterval:invocation:repeats: e timerWithTimeInterval:target:selector:userInfo:repeats:, è necessario aggiungere il timer per un ciclo corsa manualmente, con il codice come questo:

[[NSRunLoop mainRunLoop] addTimer:repeatingTimer forMode:NSDefaultRunLoopMode]; 

Altre risposte su qui suggeriscono che è necessario chiamare fire te stesso. Non lo farai - verrà chiamato non appena il timer è stato messo in loop.

+0

Ottima spiegazione! Grazie! – kev

+2

Anche con il metodo pianificato, se eseguito in un util line da riga di comando, è comunque necessario aggiungerlo manualmente a mainRunLoop, almeno nella mia esperienza, così come indicato da: [run run run nsrunloop] (http: // hackazach.net/code/2013/08/09/run-run-run-nsrunloop/) – jheld

+0

scheduleTimer ha funzionato perfettamente con questo suggerimento senza dover attivare il timer. grazie – hitme

1

La differenza tra i due è che il metodo timerWithTimeInterval restituisce un oggetto NSTimer che non è stato ancora attivato. Per attivare il timer è necessario utilizzare [timer fire]; D'altra parte il scheduledTimerWithTimeInterval restituisce un NSTimer che è già stato licenziato.

Così, nella vostra prima implementazione stavi solo perdendo [timer fire];

+4

Vedere il mio post - '[timer fire]' non "avvia" il timer, chiama semplicemente quel metodo direttamente. È necessario aggiungere il timer a un ciclo di esecuzione per l'avvio. –

+1

Wow, non ero a conoscenza di ciò, OP dovrebbe accettare la tua risposta. –

+0

Funziona una volta ma per uso continuo del processo @Joseph Humfrey code. – yazh

2

Si consiglia inoltre di aggiungere timer sul thread principale.

assert(Thread.isMainThread) 
let timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(YourSelector), userInfo: nil, repeats: true)