2010-12-30 19 views
0

Ich habe eine IBAction wo, wenn die Taste gedrückt wird, es einen ungeplanten Timer erstellt. Wenn dann derselbe Timer bereits gestartet wurde, // mache etwas, sonst starte den Timer, der erstellt wurde. Hier ist das, was ich bisher:Wie überprüfe ich, ob ein NSTimer läuft?

- (IBAction)button1Press { 



NSMethodSignature *sgn = [self methodSignatureForSelector:@selector(onTick:)]; 
NSInvocation *inv = [NSInvocation invocationWithMethodSignature: sgn]; 
[inv setTarget: self]; 
[inv setSelector:@selector(onTick:)]; 

NSTimer *tapTimer = [NSTimer timerWithTimeInterval: 1.0 
      invocation:inv 
       repeats:NO]; 



if (/*tapTimer is running*/) {//do something 
    }else{ 



    NSRunLoop *runner = [NSRunLoop currentRunLoop]; 
    [runner addTimer: tapTimer forMode: NSDefaultRunLoopMode]; 
    } 

} 

Mein Problem ist das, was als Bedingung zu setzen. Wenn ich tapTimer isValid oder! = Nil setze, gibt es immer true zurück, da tapTimer bereits deklariert ist. Ich möchte den Timer nicht ungültig machen oder nullen, weil der Hauptzweck der Taste nur die Aktion ausführen soll, wenn die Taste zweimal in einem Zeitintervall von 1 Sekunde gedrückt wird.

Wenn es einen ganz anderen Ansatz zu tun gibt, was ich will dann bitte erzählen!

Vielen Dank!

Antwort

2

Von dem, was ich bisher verstehen, sehe ich, dass Sie, ob tapTimer läuft oder nicht zu überprüfen versuchen. Ich habe einen Vorschlag. Verwenden Sie eine Variable, um anzugeben, ob der TapTimer ausgeführt wird oder nicht. Wenn Sie den Timer ausführen, ändern Sie diese Variable in true. Wenn die Zeit des Timers 0 erreicht und die ausgewählte Methode aufgerufen wird, ändern Sie diese Variable in dieser Methode in false.

Hilft das?

0

Ich würde empfehlen, einen Null-Check zu verwenden, um festzustellen, ob Ihr Timer läuft oder nicht.

... 
//Define _tapTimer in .h 

if (_tapTimer) {//do something 
} 
else{ 
    _tapTimer = [[NSTimer timerWithTimeInterval: 1.0 
      invocation:inv 
       repeats:NO] retain]; 
    NSRunLoop *runner = [NSRunLoop currentRunLoop]; 
    [runner addTimer: _tapTimer forMode: NSDefaultRunLoopMode]; 
} 

... 

-(void)timerFired:(NSTimer*)timer 
{ 
    if(timer == _tapTimer) 
    { 
     //Handle timerfired 
     [_tapTimer release], _tapTimer = nil; 
    } 
} 
+0

Vielen Dank für Ihre Antwort nicht getestet! Das hat funktioniert, aber nur wenn ich das if (timer == _tapTimer) entfernt habe. Ich sehe nicht was das tun soll? –

+0

Das ist nur dann der Fall, wenn mehrere Timer das gleiche gefeuerte Ereignis aufrufen. Es ist nicht wirklich notwendig. Die Timer haben auch Benutzerinfo-Wörterbücher, wenn Sie mehrere verwenden möchten. – Joe

-1

können Sie die Runloop abfragen es zu wissen, ob ein solcher Timer innerhalb der Schleife ist

CFRunLoopRef loopRef = [[runner currentRunLoop] getCFRunLoop]; 
Boolean timerAdded = CFRunLoopContainsTimer(loopRef, (CFRunLoopTimerRef)timer ,kCFRunLoopDefaultMode) 

if (timerAdded) 
{ 
    ... 
} 

aber, ich habe diesen Code noch

Verwandte Themen