【问题标题】:Avoiding deadlock within AVAudioEngineConfigurationChange notification callback避免 AVAudioEngineConfigurationChange 通知回调中的死锁
【发布时间】:2022-01-21 18:35:24
【问题描述】:

我有一个 Swift 类,它包含一个 AVAudioEngine 和我的实例,并像这样使用 AVAudioEngineConfigurationChange 通知:

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) {
        
        // what can I wrap this code with in order to make it not dangerous?
        // DispatchQueue.main.sync?
        engine = nil
        
    }
    
}

docs 中写道:

不要从客户端的通知中取消分配引擎 处理程序。回调发生在内部调度队列上,并且可以 尝试同步关闭引擎时出现死锁。

我什至不知道他们所说的 deallocate 是什么意思——如果它意味着有某种方法,比如 engine.reset() 或 engine.stop()... 或者它是否意味着将引擎设置为 nil...或者它是否只适用于目标 C……我不知道。

无论如何,我只想知道如何设置该方法,以便将来我不必担心破坏。

【问题讨论】:

    标签: swift concurrency deadlock avaudioengine


    【解决方案1】:

    您可以通过使用DispatchQueue.async(不同步)将其移至运行循环的下一次迭代,该队列是您管理引擎所在的任何队列(可能是主队列)。重要的是您应用从该回调返回的之后的更改。

    【讨论】:

    • 谢谢!是否可以包含我的代码的编辑版本以显示正确与错误的方式?
    猜你喜欢
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2020-01-11
    相关资源
    最近更新 更多