2010-02-07 18 views
6

Ich habe erfolgreich einen NSTimer verwendet, habe aber jetzt Probleme damit. Zweifellos etwas Dummes. Schätze andere Augen. Wenn ich den Debugger starte, sehe ich, dass applicationDidFinishLaunching aufgerufen wird, aber Trigger wird nie aufgerufen.NStimer - was mache ich hier falsch?

-(void) trigger:(NSTimer *) theTimer{ 
    NSLog(@"timer fired"); 
} 

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    nst = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(trigger) userInfo:nil repeats:YES]; 

    [window makeKeyAndVisible]; 
} 
+0

Wie auch weiter unten gesagt wurde, müssen Sie den Timer beibehalten, wenn keine Garbage Collection verwendet wird. –

+2

Wenn Sie den Timer zur Ausführung der Schleife hinzufügen, müssen Sie ihn nicht beibehalten, ich denke, die Ausführungsschleife behält ihn bei. – Jaanus

+0

Vielen Dank, dass Sie den Signaturfehler der Methode abgefangen haben. Die andere Sache, die mich stolperte, ist, dass ich _planedTimerWithInterval verwendet habe, das kein manuelles Hinzufügen zu einer Laufschleife erfordert. In diesem Fall hatte ich den terminiertenTimer Teil vergessen. – morgancodes

Antwort

13

Der Wähler muss folgende Signatur haben:

- (void)timerFireMethod:(NSTimer*)theTimer 

so müssen Sie

@selector(trigger:) 

--edit--

Vielleicht in dem Code, den Sie dies irgendwo tun sonst, aber Sie haben den Timer nicht gestartet. Sie müssen es zu einem NSRunLoop hinzufügen, bevor überhaupt Ereignisse ausgelöst werden können.

[[NSRunLoop currentRunLoop] addTimer:nst forMode:NSDefaultRunLoopMode]; 

Wenn ich die Beispiele richtig gelesen habe. Ich habe nur die Init-Methode verwendet, die sie automatisch zum aktuellen NSRunLoop hinzufügt. Sie sollten sich wirklich die Entwickler-Dokumente ansehen, die in den Kommentaren zu meinem Post enthalten sind.

+1

bleh wieder zu langsam, sorry noah :) – willcodejavaforfood

+0

+1 Hier ist die relevante Dokumentation: http://developer.apple.com/mac/library/documentation/cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html # // apple_ref/occ/clm/NSTimer/timerWithTimeInterval: target: selektor: userInfo: repeats: –

+1

zu klären: -: ist Teil des Methodennamens. Infact: ist ein vollständig gültiger Methodenname für eine Methode mit einem Argument. –

1

Der Selektor Sie den Timer geben, zeigt trigger, dass sie ein Verfahren nennen sollten, die keine Parameter annehmen. Entweder ändern Sie Ihre Timer befeuerten Methode

- (void)trigger 
{ 
     // look at me, I don't take any parameters 
     NSLog(@"timer fired"); 
} 

oder Ihren ersten Timer Anruf ändern @selector(trigger:) zu verwenden.

+1

Der Timer-Callback muss ein Argument haben, daher wird die Änderung des Methodennamens auf "Trigger" nicht funktionieren. –

+2

@jib - Nein, das ist nicht wahr. Der Timer-Rückruf funktioniert ohne das NSTimer-Argument einwandfrei. Das mache ich die ganze Zeit. –

2

Zwei Dinge:

1), wie andere sagen, sollte das Verfahren die folgenden Signatur haben ..

-(void) trigger:(NSTimer *) theTimer; 

und Sie den Timer machen somit:

nst = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(trigger:) userInfo:nil repeats:YES]; 

2) lediglich das Erstellen des Timers führt es nicht aus. Als the documentation says:

Sie müssen den neuen Timer auf einen Lauf Schleife hinzufügen, mit addTIMER: forMode :. Dann, nach Sekunden verstrichen, wird der Timer ausgelöst, Aufruf aufrufen. (Wenn die Timer konfiguriert ist, zu wiederholen, da ist nicht erforderlich, um anschließend das Timer auf die Laufschleife erneut hinzufügen.)

ist hier ein Stück echter Funktion Code, den Sie nach modellieren können. Die Timer-Erstellung ist die gleiche wie bei Ihnen, aber sie fügt sie auch hinzu, um den richtigen Weg zu finden.

[[NSRunLoop currentRunLoop] addTimer: 
    [NSTimer timerWithTimeInterval:0.1 
          target:self 
          selector:@selector(someSelector:) 
          userInfo:nil 
          repeats:NO] 
           forMode:NSDefaultRunLoopMode]; 
+4

+1 das ist richtig. Sie können auch die Convenience-Methoden 'planedTimer ...' verwenden, die den Timer für Sie zur Run-Schleife hinzufügen. –

0

Ihr Problem ist, aufgrund der Tatsache, dass timerWithTimeInterval:target:selector:userInfo:repeats: einen Timer erzeugt aber tut nicht Zeitplan es auf der Flucht Schleife, können Sie es selbst zu tun haben.

aber auch Sie können diese Methode verwenden, die den Timer und Pläne es auf der Flucht Schleife erzeugt: scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:

0

ich ein Problem hatte, wenn der Timer in - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { nicht in Haupt-Thread zu starten.

dispatch_async(dispatch_get_main_queue(), ^{ 
[self startScheduledTimer]; 
});