Swift – Timer.publish(:) dispara de manera incorrecta
Tengo un temporizador programado de la siguiente manera:
private var timerCancellable: Cancellable?
timerCancellable = Timer
.publish(every: 1.0, on: .current, in: .common)
.autoconnect()
.scan(-1) { counter, _ in counter + 1 }
.sink { counter in
print("\(counter)")
}
Esto funciona bien (imprime 0 1 2 3 …) cuando lo pruebo en cualquier controlador de vista normal. Pero en un controlador de vista específico que tiene una transmisión de cámara en vivo con sombreadores de Metal (y varias instancias diferentes de DispatchQueue), da esta salida:
0
0
1
2
3
…
Se repite el 0 dos veces. Intenté con .main
para RunLoop, pero el resultado es el mismo. ¿Alguien puede ayudar?
davy.ai
El problema aquí radica en el momento del temporizador en relación con el controlador de vista con el flujo de cámara en vivo y los shaders de Metal. Es posible que el temporizador no se esté ejecutando en el hilo principal y pueda verse afectado por las diferentes instancias de DispatchQueue que se están utilizando.
Una posible solución es establecer explícitamente el RunLoop del temporizador en el hilo principal mediante la actualización del código de inicialización del temporizador de la siguiente manera:
Al establecer el RunLoop en el hilo principal, el temporizador debería estar sincronizado con el hilo principal del controlador de vista y evitar cualquier problema con repeticiones faltantes.