scheduledtimer scheduled example create swift nstimer

create - swift timer scheduledtimer example



Usando un NSTimer en Swift (10)

En este escenario, timerFunc () nunca se llama. ¿Qué me estoy perdiendo?

class AppDelegate: NSObject, NSApplicationDelegate { var myTimer: NSTimer? = nil func timerFunc() { println("timerFunc()") } func applicationDidFinishLaunching(aNotification: NSNotification?) { myTimer = NSTimer(timeInterval: 5.0, target: self, selector:"timerFunc", userInfo: nil, repeats: true) } }


Como Drewag y Ryan señalaron, necesitas crear un temporizador programado (o programarlo tú mismo) Es más fácil crearlo ya programado con:

myTimer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "timerFunc:", userInfo: nil, repeats: true)

También necesita cambiar su definición de timerFunc (y el selector asociado) para tomar un argumento y terminar con un '':''

func timerFunc(timer:NSTimer!) { ... }


Como este hilo me hizo tratar de poner el temporizador en un RunLoop (lo que resolvió mi problema), publico también mi caso específico, quién sabe si tal vez ayude a alguien. Mi temporizador se crea durante el inicio de la aplicación y la inicialización de todos los objetos. Mi problema fue que, si bien programó el temporizador, todavía no se activó. Mi suposición es que este fue el caso porque scheduledTimerWithTimeInterval estaba poniendo el temporizador en un RunLoop diferente durante el inicio de la aplicación. Si, en cambio, inicializo el temporizador y luego uso NSRunLoop.mainRunLoop().addTimer(myTimer, forMode:NSDefaultRunLoopMode) , funciona bien.


Con swift3, puede ejecutarlo con,

var timer: Timer? func startTimer() { if timer == nil { timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(self.loop), userInfo: nil, repeats: true) } } func stopTimer() { if timer != nil { timer?.invalidate() timer = nil } } func loop() { //do something }


Esto es un poco de código, que demuestra cómo llamar a una función (demorada) con Y sin un parámetro.

Úselo en un nuevo proyecto en xCode (aplicación SingleView) y coloque el código en el viewController estándar:

class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: Selector("delayedFunctionWithoutParameter:"), userInfo: nil, repeats: false) let myParameter = "ParameterStringOrAnyOtherObject" NSTimer.scheduledTimerWithTimeInterval(4.0, target: self, selector: Selector("delayedFunctionWithParameter:"), userInfo: myParameter, repeats: false) } // SIMPLE TIMER - Delayed Function Call func delayedFunctionWithoutParameter(timer : NSTimer) { print("This is a simple function beeing called without a parameter passed") timer.invalidate() } // ADVANCED TIMER - Delayed Function Call with a Parameter func delayedFunctionWithParameter(timer : NSTimer) { // check, wether a valid Object did come over if let myUserInfo: AnyObject = timer.userInfo { // alternatively, assuming it is a String for sure coming over // if let myUserInfo: String = timer.userInfo as? String { // assuming it is a string comming over print("This is an advanced function beeing called with a parameter (in this case: /(myUserInfo)) passed") } timer.invalidate() } }

Tenga en cuenta que, en cualquier caso, debe implementar la función retardada con el parámetro (temporizador: NSTimer) para poder invalidar (finalizar, finalizar) el temporizador. Y con el "temporizador" passend también tiene acceso a userInfo (y allí puede poner cualquier objeto, no solo String-Objects, así como tipos de colección como matrices y diccionarios).

La documentación original de Apples dice "" -> El temporizador se pasa a sí mismo como argumento, por lo tanto, el método adoptaría el siguiente patrón: - (void) timerFireMethod: (NSTimer *) timer Leer completamente -> here


Los NSTimer no se programan automáticamente a menos que use NSTimer.scheduledTimerWithTimeInterval :

myTimer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "timerFunc", userInfo: nil, repeats: true)


Para hacerlo con el método que OP sugiere, debe agregarlo a un ciclo de ejecución:

myTimer = NSTimer(timeInterval: 5.0, target: self, selector:"timerFunc", userInfo: nil, repeats: true) NSRunLoop.mainRunLoop().addTimer(myTimer, forMode:NSDefaultRunLoopMode)

La documentación también dice que el objetivo debe tomar un argumento, pero funciona sin él.

func timerFireMethod(timer: NSTimer) { }


Puede crear un temporizador programado que se agrega automáticamente al runloop y comienza a disparar:

NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "timerDidFire:", userInfo: userInfo, repeats: true)

O bien, puede conservar su código actual y agregar el temporizador al runloop cuando esté listo para ello:

let myTimer = NSTimer(timeInterval: 0.5, target: self, selector: "timerDidFire:", userInfo: nil, repeats: true) NSRunLoop.currentRunLoop().addTimer(myTimer, forMode: NSRunLoopCommonModes)


Sintaxis de Swift 3.0 para el asunto del ciclo de ejecución:

RunLoop.current.add(myTimer, forMode: .commonModes)


utilizo un enfoque similar a Luke. Solo una advertencia para las personas que son puristas de "métodos privados":

NO haga que la devolución de llamada sea privada en Swift.

Si tú escribes:

private func timerCallBack(timer: NSTimer){

..

conseguirás:

timerCallBack:]: selector no reconocido enviado a instancia ... Aplicación de terminación debido a excepción no detectada ''NSInvalidArgumentException''


Para Swift 3

var timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(ViewController.updateTimer), userInfo: nil, repeats: true); RunLoop.current.add(timer, forMode: RunLoopMode.commonModes)