Wie verwende ich eine NSTimer
? Kann mir jemand eine Schritt-für-Schritt-Anleitung geben?
Antworten
Zu viele Anzeigen?Zunächst möchte ich Ihre Aufmerksamkeit auf die Cocoa/CF-Dokumentation lenken (die immer eine gute erste Anlaufstelle ist). Die Apple-Dokumente haben am Anfang jedes Referenzartikels einen Abschnitt namens "Companion Guides", in dem Anleitungen für das dokumentierte Thema aufgelistet sind (sofern vorhanden). Zum Beispiel, mit NSTimer
, die Dokumentation enthält zwei Begleitbücher:
Für Ihre Situation ist der Artikel Timer-Programmierungsthemen wahrscheinlich am nützlichsten, während Threading-Themen zwar verwandt sind, aber nicht direkt mit der zu dokumentierenden Klasse in Verbindung stehen. Der Artikel Timer-Programmierungsthemen ist in zwei Teile unterteilt:
- Zeitschaltuhren
- Timer verwenden
Bei Artikeln, die dieses Format haben, gibt es oft einen Überblick über die Klasse und ihre Verwendung, und dann etwas Beispielcode auf wie um sie zu verwenden, in diesem Fall im Abschnitt "Verwendung von Zeitschaltuhren". Dort gibt es Abschnitte über "Erstellen und Planen eines Zeitgebers", "Anhalten eines Zeitgebers" und "Speicherverwaltung". Aus dem Artikel geht hervor, dass die Erstellung eines geplanten, sich nicht wiederholenden Zeitgebers etwa so erfolgen kann:
[NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(targetMethod:)
userInfo:nil
repeats:NO];
Dadurch wird ein Timer erstellt, der nach 2,0 Sekunden ausgelöst wird und die targetMethod:
auf self
mit einem Argument, das ein Zeiger auf die Datei NSTimer
Instanz.
Wenn Sie sich die Methode genauer ansehen möchten, können Sie in der Dokumentation weitere Informationen finden, aber es gibt auch Erläuterungen zum Code.
Wenn Sie einen Timer stoppen wollen, der sich wiederholt (oder einen nicht-wiederholenden Timer stoppen wollen, bevor er ausgelöst wird), dann müssen Sie einen Zeiger auf den NSTimer
Instanz, die erstellt wurde; oft muss dies eine Instanzvariable sein, damit Sie in einer anderen Methode darauf verweisen können. Sie können dann invalidate
über die NSTimer
Instanz:
[myTimer invalidate];
myTimer = nil;
Es ist auch eine gute Praxis, wenn nil
aus der Instanzvariablen heraus (z. B. wenn Ihre Methode, die den Timer ungültig macht, mehr als einmal aufgerufen wird und die Instanzvariable nicht auf nil
und die NSTimer
Instanz freigegeben wurde, wird eine Ausnahme ausgelöst).
Beachten Sie auch den Punkt zur Speicherverwaltung am Ende des Artikels:
Da die Ablaufschleife den Timer verwaltet, ist aus Sicht der Speicherverwaltung Es besteht normalerweise keine Notwendigkeit, einen Verweis auf einen Timer zu behalten, nachdem Sie ihn geplant haben. . Da der Zeitgeber als Argument übergeben wird, wenn Sie seine Methode als Selektor angeben, Sie können einen sich wiederholenden Zeitgeber innerhalb dieser Methode ungültig machen . In vielen Situationen möchten Sie jedoch auch die Möglichkeit haben, den Timer außer Kraft zu setzen - vielleicht sogar bevor er startet. In diesem Fall müssen Sie einen Verweis auf den Timer aufbewahren, so dass Sie ihm bei Bedarf eine Ungültigkeitsmeldung senden können . Wenn Sie einen ungeplanten Zeitgeber erstellen (siehe "Ungeplante Zeitgeber"), müssen Sie einen starken Verweis auf den Zeitgeber beibehalten (in einer Umgebung mit Referenzzählung behalten Sie ihn), damit er nicht freigegeben wird, bevor Sie ihn verwenden.
Es gibt mehrere Möglichkeiten, einen Timer zu verwenden:
1) Zeitschaltuhr & Wahlschalter verwenden
NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 2.0
target: self
selector:@selector(onTick:)
userInfo: nil repeats:NO];
- Wenn Sie Wiederholungen auf NEIN setzen, wartet der Timer 2 Sekunden, bevor er den Selektor auslöst, und hält dann an;
- wenn Wiederholung: JA, wird der Timer sofort gestartet und ruft alle 2 Sekunden erneut den Selektor auf;
- zum Anhalten des Zeitgebers rufen Sie die Methode -invalidate des Zeitgebers auf: [t invalidate];
Nebenbei bemerkt: Anstatt einen Timer zu verwenden, der sich nicht wiederholt und den Selektor nach einem bestimmten Intervall aufruft, könnten Sie eine einfache Anweisung wie diese verwenden:
[self performSelector:@selector(onTick:) withObject:nil afterDelay:2.0];
Dies hat die gleiche Wirkung wie der obige Beispielcode; wenn Sie den Selektor jedoch jedes n-te Mal aufrufen möchten, verwenden Sie den Timer mit repeats:YES;
2) selbstgesteuerte Zeitschaltuhr
NSDate *d = [NSDate dateWithTimeIntervalSinceNow: 60.0];
NSTimer *t = [[NSTimer alloc] initWithFireDate: d
interval: 1
target: self
selector:@selector(onTick:)
userInfo:nil repeats:YES];
NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer:t forMode: NSDefaultRunLoopMode];
[t release];
- wird ein Timer erstellt, der zu einem von Ihnen festgelegten Datum (in diesem Fall nach einer Minute) startet und sich alle eine Sekunde wiederholt
3) außerplanmäßiger Timer & Aufruf verwenden
NSMethodSignature *sgn = [self methodSignatureForSelector:@selector(onTick:)];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature: sgn];
[inv setTarget: self];
[inv setSelector:@selector(onTick:)];
NSTimer *t = [NSTimer timerWithTimeInterval: 1.0
invocation:inv
repeats:YES];
und danach starten Sie den Timer manuell, wann immer Sie ihn brauchen:
NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer: t forMode: NSDefaultRunLoopMode];
Und als Anmerkung, onTick: Methode sieht wie folgt aus:
-(void)onTick:(NSTimer *)timer {
//do smth
}
#import "MyViewController.h"
@interface MyViewController ()
@property (strong, nonatomic) NSTimer *timer;
@end
@implementation MyViewController
double timerInterval = 1.0f;
- (NSTimer *) timer {
if (!_timer) {
_timer = [NSTimer timerWithTimeInterval:timerInterval target:self selector:@selector(onTick:) userInfo:nil repeats:YES];
}
return _timer;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
-(void)onTick:(NSTimer*)timer
{
NSLog(@"Tick...");
}
@end
- See previous answers
- Weitere Antworten anzeigen