2016-09-02 4 views
0

Ich habe ein Problem mit zwei Timern, die im selben View Controller laufen. Ich brauche einen von ihnen zu starten, wenn der andere für ungültig erklärt wird und nach dem Startknopf für den ersten erneut angezapft wird. Ich habe versucht, zwei Variablen zu erstellen, und es baut erfolgreich, aber das Verhalten ist unberechenbar. Was wäre der richtige Ansatz? DankIch brauche zwei Timer im selben View Controller ios

@IBAction func Start(_ sender: AnyObject) { 
    timer2.invalidate() 
    timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(ViewController.update), userInfo: nil, repeats: true) 
} 




@IBAction func pauseTimer(_ sender: AnyObject) { 

    timer.invalidate() 

    timer2 = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: Selector(("increaseTimer")), userInfo: nil, repeats: true) 



} 

Antwort

0

Sie müssen also eine Art "Flip-Flop" Timer-Effekt?

Haben Sie überlegt, var timerHasFinishedRunning: Bool = false durch Überprüfung der Ungültigkeit zu ersetzen?

z.B.

// When you invalidate, rather 
timer1.invalidate() 
timer1 = nil 

// As goes for timer2 
timer2.invalidate() 
timer2 = nil 

Auf diese Weise können Sie Ihre Timer Überprüfung getan Ansicht berechnet Eigenschaften haben:

var timer1HasFinishedRunning: Bool { 
    return self.timer1 == nil 
} 

var timer1HasFinishedRunning: Bool { 
    return self.timer2 == nil 
} 

auch erwähnen, dass sie „unberechenbar“ verhalten, könnten Sie das näher erläutern? Ihr Timer-Intervall beträgt 1 Sekunde. Wenn etwas Unberechenbares passiert, "innerhalb von 1 Sekunde", liegt das wahrscheinlich an dem langen Intervall. z.B. Die Überprüfung von jedem wird nur einmal pro Sekunde durchgeführt, daher kann es manchmal bis zu 1.999999 Sekunden dauern, bis festgestellt wird, dass ein Timer ungültig ist.

Persönlich hätte ich das Intervall bei 0,1 anstelle von 1,0 für größere Genauigkeit.

+0

Danke für den Vorschlag. Ich kann es für meine App verwenden. Jetzt kann ich nicht herausfinden, was mit dem folgenden einfachen Flip-Flop-Timer-Code falsch ist. Wenn ich es ausführe, habe ich Thread 1: Signal SIGABRT zum Absturz gebracht (es ist nicht der Fall, bei dem die Zuweisung versehentlich erfolgt ist). Wenn ich Timer 2 entferne. Die Pause funktioniert gut (ich habe mein Beispiel bearbeitet). Vielen Dank! –

+0

etwas anderes habe ich gerade bemerkt, in Ihrem Timer2, haben Sie den Selektor auf 'Selector ((" increaseTimer ") gesetzt)', während es sollte '#selector (ViewController.increaseTimer)' –

+0

Ich habe dies versucht. Fehlermeldung: "Typ ViewController hat kein Mitglied 'increaseTimer'" –

Verwandte Themen