scheduledtimer scheduled example create timer swift3

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() }