es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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:

    timerCancellable = Timer
                .publish(every: 1.0, on: .main, in: .common)
                .autoconnect()
                .scan(-1) { counter, _ in counter + 1 }
                .sink { counter in
                    print("\(counter)")
                }
    

    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.

Comments are closed.