UIScrollView detiene NSTimer hasta que finaliza el desplazamiento
-
03-07-2019 - |
Pregunta
Mientras se desplaza un UIScrollView
(o una clase derivada del mismo), parece que todos los NSTimers
que se están ejecutando se detienen hasta que finaliza el desplazamiento.
¿Hay una manera de evitar esto? ¿Trapos? ¿Un ajuste de prioridad? ¿Algo?
Solución
Un sencillo & amp; La solución simple de implementar es hacer:
NSTimer *timer = [NSTimer timerWithTimeInterval:...
target:...
selector:....
userInfo:...
repeats:...];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
Otros consejos
Para cualquiera que use Swift 3
timer = Timer.scheduledTimer(timeInterval: 0.1,
target: self,
selector: aSelector,
userInfo: nil,
repeats: true)
RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)
Sí, Paul tiene razón, este es un problema de bucle de ejecución. Específicamente, necesita utilizar el método NSRunLoop:
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
Esta es la versión swift.
timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: aSelector, userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
Tienes que ejecutar otro hilo y otro bucle de ejecución si quieres que los temporizadores se activen mientras se desplaza; Dado que los temporizadores se procesan como parte del bucle de eventos, si está ocupado procesando el desplazamiento de su vista, nunca podrá acceder a los temporizadores. Aunque la pena de rendimiento / batería de correr temporizadores en otros subprocesos podría no valer la pena manejar este caso.
para cualquiera que use Swift 4:
timer = Timer(timeInterval: 1, target: self, selector: #selector(timerUpdated), userInfo: nil, repeats: true)
RunLoop.main.add(timer, forMode: .common)