scheduled - timer swift 4
Usando Swift 3 Deteniendo un temporizador programado, el temporizador continĂșa disparando incluso si el temporizador es nulo (3)
Llamamos a la función startTimer para iniciar un temporizador. Cuando queríamos detenerlo, llamamos a la función stopTimerTest, pero después de llamar a la función stopTimer, el timerTestAction continúa disparándose. Para verificar la condición del temporizador, usamos imprimir e imprimir en timerActionTest devuelve nil.
var timerTest: Timer? = nil
func startTimer () {
timerTest = Timer.scheduledTimer(
timeInterval: TimeInterval(0.3),
target : self,
selector : #selector(ViewController.timerActionTest),
userInfo : nil,
repeats : true)
}
func timerActionTest() {
print(" timer condition /(timerTest)")
}
func stopTimerTest() {
timerTest.invalidate()
timerTest = nil
}
Lo más probable es que haya llamado a startTimer
dos veces sin llamar a stopTimerTest
. Si lo hace, perderá su puntero al temporizador original y nunca podrá invalidarla.
El enfoque típico es administrar la invalidación como parte de la configuración:
var timerTest : Timer? = nil {
willSet {
timerTest?.invalidate()
}
}
Entonces, detenerse solo se establece en nulo:
func stopTimerTest() {
timerTest = nil
}
Trate de hacer los siguientes cambios a su código:
Primero, tienes que cambiar la forma en que declaras timerTest
var timerTest : Timer?
luego, en startTimer
antes de instanciar, compruebe si timerTest
es nulo
func startTimer () {
if timerTest == nil {
timerTest = Timer.scheduledTimer(
timeInterval: TimeInterval(0.3),
target : self,
selector : #selector(ViewController.timerActionTest),
userInfo : nil,
repeats : true)
}
}
Finalmente, en tu stopTimerTest
, invalidas el timerTest
si no es nulo.
func stopTimerTest() {
if timerTest != nil {
timerTest!.invalidate()
timerTest = nil
}
}
Verifique si realmente llama a stopTimerTest()
, porque timerTest.invalidate()
es correcto para detener el temporizador.
func stopTimerTest() {
print("stopTimer")
timerTest.invalidate()
}