Saltar al contenido

¿Cómo puedo usar Timer (antes NSTimer) en Swift?

Esta crónica fue probado por nuestros expertos para que tengas la garantía de la veracidad de este tutorial.

Solución:

Esto funcionará:

override func viewDidLoad() 
    super.viewDidLoad()
    // Swift block syntax (iOS 10+)
    let timer = Timer(timeInterval: 0.4, repeats: true)  _ in print("Done!") 
    // Swift >=3 selector syntax
    let timer = Timer.scheduledTimer(timeInterval: 0.4, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)
    // Swift 2.2 selector syntax
    let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(MyClass.update), userInfo: nil, repeats: true)
    // Swift <2.2 selector syntax
    let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "update", userInfo: nil, repeats: true)


// must be internal or public. 
@objc func update() 
    // Something cool

Para Swift 4, el método del que desea obtener el selector debe estar expuesto a Objective-C, por lo tanto @objc attribute debe agregarse a la declaración del método.

Evento repetido

Puede usar un temporizador para realizar una acción varias veces, como se ve en el siguiente ejemplo. El temporizador llama a un método para actualizar una etiqueta cada medio segundo.

ingrese la descripción de la imagen aquí

Aquí está el código para eso:

import UIKit

class ViewController: UIViewController 

    var counter = 0
    var timer = Timer()

    @IBOutlet weak var label: UILabel!

    // start timer
    @IBAction func startTimerButtonTapped(sender: UIButton) 
        timer.invalidate() // just in case this button is tapped multiple times

        // start the timer
        timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
    

    // stop timer
    @IBAction func cancelTimerButtonTapped(sender: UIButton) 
        timer.invalidate()
    

    // called every time interval from the timer
    func timerAction() 
        counter += 1
        label.text = "(counter)"
    

Evento retrasado

También puede usar un temporizador para programar un evento único para algún momento en el futuro. La principal diferencia con el ejemplo anterior es que se utiliza repeats: false en vez de true.

timer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(delayedAction), userInfo: nil, repeats: false)

El ejemplo anterior llama a un método llamado delayedAction dos segundos después de configurar el temporizador. No se repite, pero aún puedes llamar timer.invalidate() si necesita cancelar el evento antes de que suceda.

notas

  • Si existe alguna posibilidad de iniciar su instancia de temporizador varias veces, asegúrese de invalidar primero la instancia de temporizador anterior. De lo contrario, pierde la referencia al temporizador y ya no puede detenerlo. (ver estas preguntas y respuestas)
  • No utilice temporizadores cuando no se necesiten. Consulte la sección de temporizadores de la Guía de eficiencia energética para aplicaciones iOS.

Relacionado

  • Cómo trabajar con fechas y horas en Swift

Actualizado a Swift 4, aprovechando la información de usuario:

class TimerSample 

    var timer: Timer?

    func startTimer() 
        timer = Timer.scheduledTimer(timeInterval: 5.0,
                                     target: self,
                                     selector: #selector(eventWith(timer:)),
                                     userInfo: [ "foo" : "bar" ],
                                     repeats: true)
    

    // Timer expects @objc selector
    @objc func eventWith(timer: Timer!) 
        let info = timer.userInfo as Any
        print(info)
    


Calificaciones y reseñas

Si tienes alguna incertidumbre y capacidad de aumentar nuestro crónica te proponemos escribir una crítica y con mucho gusto lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *