2016-07-16 11 views
0

Ich möchte einen Timer im Hintergrund ausführen. Also habe ich ein Singleton erstellt.NSTimer terminatedTimerWithTimeInterval - nicht aufrufen funciton

Das Problem ist, dass nach den eingestellten 5.0 Sekunden, ruft es nicht die Funktion timeEnded(). Xcode schlägt vor, @Objc vor der Funktion hinzuzufügen (so: @Objc func timeEnded() {...), um ein Problem zu lösen (ich bekomme aber nicht was). Aber diese Funktion wird immer noch nicht aufgerufen. Irgendwelche Ideen?

+0

bitte Ihre Xcode Version –

+0

Haben Sie den Timer auf eine Laufschleife überall hinzufügen? Sie sollten auch Ihren Code und keinen Screenshot posten. –

+0

Xcode 7.3.1 - Tut mir leid, ich habe es durch den Code ersetzt. Ich bin mir nicht sicher über diese Schleife. Aber das hängt mit einer anderen Frage zusammen, die ich habe: Ich starte den Timer in der 'viewDidLoad()' Methode in meinem ViewController. Und wenn ich es starte, bekomme ich "Timer schon gestartet" in der Konsole. Vielleicht hat das etwas mit dem Problem zu tun? – Quantm

Antwort

3

Sie starten den Timer nie wirklich, weil Ihre startTimer() Funktion immer zurückkehrt, bevor Sie die Codezeile erreichen, wo Sie den Timer erstellen.

In Ihrem guard Aussage, die Sie nur die Ausführung der Funktion, wenn internalTimer != nil fortsetzen, aber der einzige Ort, wo Sie den Timer nach diese Aussage ist. Daher wird Ihr Timer nie erstellt und internalTimer wird immer nil sein.

Dies sollte Ihr Problem beheben:

func startTimer() { 
    guard internalTimer == nil else { 
     return print("timer already started") 
    } 
    internalTimer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: #selector(TimerService.timeEnded), userInfo: nil, repeats: false) 
} 
+2

Sie haben Recht. Ich schlage vor, dass Sie Ihre Antwort redigieren, um die korrekte Schutzanweisung mit 'timer == nil' zu zeigen – Paulw11

+0

Gute Idee! Wird besorgt. – Mischa

2

Selektoren sind eine Funktion von Objective-C und können nur mit Methoden verwendet werden, die der dynamischen Obj-C-Laufzeit ausgesetzt sind. Sie können keine Auswahl zu einer reinen Swift-Methode haben.

Wenn Ihre Klasse von NSObject erbt, werden ihre öffentlichen Methoden automatisch Obj-C ausgesetzt. Da Ihre Klasse nicht von NSObject erbt, müssen Sie das @objc-Attribut verwenden, um anzugeben, dass diese Methode für Obj-C verfügbar gemacht werden soll, damit sie mit einem Obj-C-Selektor aufgerufen werden kann.

#selector() ist die neue Syntax in Swift 2.2. Es ermöglicht dem Compiler zu überprüfen, dass der Selektor, den Sie verwenden möchten, tatsächlich vorhanden ist. Die alte Syntax ist veraltet und wird in Swift 3.0 entfernt.

+0

Okay, jetzt verstehe ich den Fehler :) Das ist ein Anfang. Aber die Funktion wird immer noch nicht aufgerufen, leider – Quantm

+1

Eigentlich in iOS 10 brauchst du gar keinen Selektor. iOS 10 verfügt über blockbasierte Timer. – matt