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.

Evitando el bloqueo dentro del callback de notificación AVAudioEngineConfigurationChange.

Tengo una clase Swift que contiene una instancia de AVAudioEngine y estoy utilizando la notificación AVAudioEngineConfigurationChange de la siguiente manera:

class Demonstration: NSObject {

    var engine: AVAudioEngine? = AVAudioEngine()

    // ...

    override init() {
        super.init()

        // ...

        NotificationCenter.default.addObserver(self,
                                               selector: #selector(self.handleEngineConfigChange(_:)),
                                               name: .AVAudioEngineConfigurationChange,
                                               object: nil)
    }

    @objc func handleEngineConfigChange(_ notification: Notification) {

        // ¿Con qué puedo envolver este código para que no sea peligroso?
        // ¿DispatchQueue.main.sync?
        engine = nil

    }
}

En la documentación dice:

No desasigne el motor dentro del manejador de notificaciones del cliente. La llamada de retorno ocurre en una cola de despacho interna y puede bloquearse al intentar desmontar el motor de forma síncrona.

Realmente no sé a qué se refieren con “desasignar” —si se refieren a algún método como engine.reset() o engine.stop()… o si se refiere a establecer el motor en nil… o si solo se aplica a Objective-C… lo cual no sé.

En cualquier caso, me gustaría saber cómo configurar el método para no tener que preocuparme por romper cosas en el futuro.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La documentación establece que desasignar el motor dentro del controlador de notificaciones del cliente puede provocar un bloqueo al intentar desmontar el motor de manera síncrona. Esto significa que establecer el motor como nulo dentro del método handleEngineConfigChange() puede generar problemas y se recomienda no hacerlo.

    Para que el código sea seguro, una opción es envolver el bloque de código que establece el motor como nulo dentro de un bloque DispatchQueue.main.async. Esto asegurará que el código se ejecute de forma asíncrona en el hilo principal y no bloquee la cola de envío interna que maneja la notificación AVAudioEngineConfigurationChange. El código modificado se vería así:

    @objc func handleEngineConfigChange(_ notification: Notification) {
    
        // envolver el código en un bloque DispatchQueue.main.async para que sea seguro
        DispatchQueue.main.async {
            self.engine = nil
        }
    
    }
    

    Al utilizar DispatchQueue.main.async, le estamos indicando al código que se ejecute en el hilo principal de forma asíncrona, lo cual garantiza que no interfiera con la cola de envío interna que maneja la notificación AVAudioEngineConfigurationChange. De esta manera, podemos establecer de forma segura el motor como nulo sin preocuparnos por causar problemas.

Comments are closed.