Wie benutze ich eine NSTimer
? Kann mir jemand Schritt für Schritt Anweisungen geben?
objective-c
cocoa
nstimer
lab12
quelle
quelle
Antworten:
Zunächst möchte ich Sie auf die Cocoa / CF-Dokumentation aufmerksam machen (die immer eine gute erste Anlaufstelle ist). In den Apple-Dokumenten befindet sich oben in jedem Referenzartikel ein Abschnitt mit dem Namen "Companion Guides", in dem Anleitungen für das zu dokumentierende Thema aufgeführt sind (falls vorhanden). Zum Beispiel mit
NSTimer
, die Dokumentation listet zwei Begleiter Führungen:Für Ihre Situation ist der Artikel über Timer-Programmierthemen wahrscheinlich am nützlichsten, während Threading-Themen verwandt sind, jedoch nicht direkt mit der zu dokumentierenden Klasse. Wenn Sie sich den Artikel über Timer-Programmierthemen ansehen, ist er in zwei Teile unterteilt:
Für Artikel, die dieses Format annehmen, gibt es häufig eine Übersicht über die Klasse und deren Verwendung sowie einen Beispielcode für deren Verwendung, in diesem Fall im Abschnitt "Verwenden von Timern". Es gibt Abschnitte zu "Erstellen und Planen eines Timers", "Stoppen eines Timers" und "Speicherverwaltung". Aus dem Artikel geht hervor, dass ein geplanter, sich nicht wiederholender Timer wie folgt erstellt werden kann:
Dadurch wird ein Timer erstellen , die nach 2,0 Sekunden abgefeuert wird , und fordert
targetMethod:
aufself
mit einem Argument, das ein Zeiger auf die istNSTimer
Instanz.Wenn Sie sich die Methode dann genauer ansehen möchten, können Sie auf die Dokumente zurückgreifen, um weitere Informationen zu erhalten. Es gibt jedoch auch Erklärungen zum Code.
Wenn Sie einen sich wiederholenden Timer stoppen möchten (oder einen sich nicht wiederholenden Timer stoppen möchten, bevor er ausgelöst wird), müssen Sie einen Zeiger auf die erstellte
NSTimer
Instanz behalten . Oft muss dies eine Instanzvariable sein, damit Sie in einer anderen Methode darauf verweisen können. Sie können danninvalidate
dieNSTimer
Instanz aufrufen :Es wird auch empfohlen
nil
, die Instanzvariable zu löschen (wenn beispielsweise Ihre Methode, die den Timer ungültig macht, mehrmals aufgerufen wird und die Instanzvariable nicht auf gesetztnil
und dieNSTimer
Instanz freigegeben wurde, wird eine Ausnahme ausgelöst).Beachten Sie auch den Punkt zur Speicherverwaltung am Ende des Artikels:
quelle
YES
für ,repeats:
wenn Sie anrufenscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
. Wenn Sie dies tun, stellen Sie sicher, dass Sie einen Verweis auf dieNSTimer
Instanz behalten (dieser wird von der Methode zurückgegeben), und befolgen Sie den oben beschriebenen Punkt zur Speicherverwaltung.target
und angebenselector
. Wenn sich beispielsweise Ihr Zielself
und der Selektor befindentimerMethod:
, wird die MethodetimerMethod:
definiert , die beim Auslösen des Timers aufgerufen wirdself
. Sie können dann den gewünschten Code in diese Methode einfügen, und die Methode wird immer dann aufgerufen, wenn der Timer ausgelöst wird. Beachten Sie, dass die beim Auslösen des Timers aufgerufene Methode (die Sie als übergebenselector:
) nur ein Argument annehmen kann (das beim Aufrufen ein Zeiger auf dieNSTimer
Instanz ist).self
"Es gibt verschiedene Möglichkeiten, einen Timer zu verwenden:
1) Geplanter Timer & mit Selektor
Als Randnotiz können Sie anstelle eines Timers, der sich nicht wiederholt und den Selektor nach einem bestimmten Intervall aufruft, eine einfache Anweisung wie die folgende verwenden:
Dies hat den gleichen Effekt wie der obige Beispielcode. Wenn Sie den Selektor jedoch jedes n-te Mal aufrufen möchten, verwenden Sie den Timer mit Wiederholungen: YES;
2) selbst geplanter Timer
3) außerplanmäßiger Timer & Aufruf
und danach starten Sie den Timer manuell, wann immer Sie dies benötigen:
Und als Hinweis sieht die onTick: -Methode folgendermaßen aus:
quelle
Etwas wie das:
quelle
quelle
MyViewController
nie freigegeben wird.quelle
Den Antworten fehlt eine bestimmte Tageszeit. Hier ist die nächste Stunde:
Ersetzen Sie "doRefresh" natürlich durch die gewünschte Methode Ihrer Klasse
Versuchen Sie, das Kalenderobjekt einmal zu erstellen und die allUnits aus Effizienzgründen statisch zu machen.
Das Hinzufügen einer Stunde zur Komponente funktioniert einwandfrei, es ist kein Mitternachtstest erforderlich ( Link )
quelle