2017-07-11 17 views
0

Ich schreibe Timer-Funktionen, um zu überprüfen, ob es gerade läuft, aber es scheint, dass ich immer die Timer-Variable zu Null gefunden habe. Damit wird immer eine neue Timer-Instanz erstellt.Swift 3 überprüfen, ob der Timer läuft

weak var myTimer: Timer? 

// starting a timer 
func startTimer(timer: Timer?, interval: Double, _selector: Selector, _repeats: Bool){ 
    weak var _timer = timer 

    if (_timer == nil){ 
     _timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: _selector, userInfo: nil, repeats: _repeats) 
    } 
} 

// stopping a timer 
func stopTimer(timer: Timer?){ 
    var _timer = timer 

    if (_timer != nil){ 
     _timer!.invalidate() 
     _timer = nil 
    } 
} 

Timer starten durch

Aufruf
self.startTimer(timer: self.myTimer, interval: 0.1, _selector: #selector(self.updateTimer), _repeats: true) 

Irgendwie, auch nachdem der Timer gestartet wird, ist es immer noch gleich Null. Wenn die Funktion zum zweiten Mal aufgerufen wird, plant sie eine weitere Timer-Instanz. Und wenn ich versuche, es zu stoppen, wird es nicht erfolgreich sein, da es immer Null war. Wie kann ich das lösen?

danke

+0

Beide '_timer' Variablen sind im lokalen Bereich und nicht miteinander verwandt. Was erwartest du? – vadian

+0

überprüfen Sie den Umfang und warum verwenden Sie schwach – zombie

+0

Ich habe versucht, nicht schwach var zu verwenden. Ich habe versucht, .isValid-Methode zu verwenden, aber da es Null ist, wird dies nicht funktionieren. –

Antwort

2

Dies wird erwartet. Sie weisen die neue Timer-Instanz innerhalb Ihrer Funktion auf weak var zu. Dadurch wird die Zuweisung aufgehoben, wenn Sie den Funktionsbereich verlassen. Die timer Variable Funktion muss als inout

func startTimer(timer: inout Timer?, interval: Double, _selector: Selector, _repeats: Bool) { 
if (timer == nil){ 
     timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: _selector, userInfo: nil, repeats: _repeats) 
    } 
deklariert werden

Das gleiche gilt für Ihre zweite Funktion geht - Sie zuweisen nil nur auf lokalen Variable in Funktionsumfang, nicht auf die Variable außerhalb.

+0

Danke, die 'inout' ist der Schlüssel hier, danke. –