2012-06-15 39 views
28

Stworzyłem aplikację testową z timerem przed jej implementacją w moim projekcie. Po raz pierwszy korzystam z timera. Ale problem jest, gdy zaimplementowałem timer przy użyciu [NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];, to nie działa. Oto mój kod, Interfejs:Timer NSTimerWithTimeInterval: nie działa

@interface uialertViewController : UIViewController 
{ 

    NSTimer *timer; 
} 

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

Realizacja:

@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 

Potem zmieniłem[NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];z[NSTimer scheduledTimerWithTimeInterval: target: selector:userInfo: repeats: ];, ona pracuje. Co było problemem z timerWithTimeInterval:? Czy zmieniam coś w mojej pierwszej implementacji? Z góry dziękuję.

+0

timerWithTimeInterval tworzy licznik czasu, ale go nie uruchamia i nie planuje ... robi. Myślę, że to jedyna różnica – rooster117

+0

@ rooster117: wtedy muszę zadzwonić do metody timerów ognia, czy mam rację? –

+0

Tak lub po prostu wywołaj metodę scheduleTimerWithTimeInterval, gdy chcesz ją uruchomić. Tak czy inaczej – rooster117

Odpowiedz

115

scheduledTimerWithTimeInterval:invocation:repeats: i scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: tworzyć czasomierze, które są automatycznie dodawane do NSRunLoop, co oznacza, że ​​nie trzeba dodawać je samodzielnie. Dodanie ich do NSRunLoop powoduje, że strzelają.

Z timerWithTimeInterval:invocation:repeats: i timerWithTimeInterval:target:selector:userInfo:repeats:, trzeba dodać licznik do pętli uruchamiany ręcznie, z kodem tak:

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

Inne odpowiedzi na temat tutaj sugerują, że trzeba zadzwonić fire siebie. Nie musisz - zostanie wywołany, gdy tylko timer zostanie ustawiony na pętlę startową.

+0

Świetne wyjaśnienie! Dzięki! – kev

+2

Nawet z zaplanowaną metodą, jeśli działasz z wykorzystaniem wiersza poleceń, nadal musisz dodać ją do mainRunLoop ręcznie, przynajmniej w moim doświadczeniu, a także wskazać przez: [run run run nsrunloop] (http: // hackazach.net/code/2013/08/09/run-run-run-ns-pl/noilloop/) – jheld

+0

scheduledTimer działało idealnie z tą sugestią bez konieczności odpalania stopera. dziękuję – hitme

1

Różnica między nimi polega na tym, że metoda timerWithTimeInterval zwraca obiekt NSTimer, który nie został jeszcze uruchomiony. Aby zwolnić timer, musisz użyć [timer fire]; Z drugiej strony scheduledTimerWithTimeInterval zwraca NSTimer, który został już uruchomiony.

Tak więc w pierwszej realizacji ty po prostu brakuje [timer fire];

+4

Zobacz mój post - '[timer fire]' nie "uruchamia" timera, po prostu bezpośrednio wywołuje tę metodę. Musisz dodać timer do pętli uruchamiania, aby mógł się uruchomić. –

+1

Wow, nie wiedziałem o tym, OP powinien zaakceptować twoją odpowiedź. –

+0

Działa jednokrotnie, ale w celu ciągłego używania kodu @Josepha Humfreya. – yazh

2

Można również dodać timer na głównym wątku.

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