节拍器倒计时,如何从后台线程发布到主线程以启动记录器?

问题描述 投票:0回答:1

我一直在研究如何实现节拍器倒计时,但是遇到了与线程和实现有关的问题。

我的实现使用AudioKit AKMetronome,一种处理metronome.start的方法,并且metronome.callback处理程序在给定数量的小节完成后启动recording

init () {
  metronome.callback = handler
}

func record () {
    self.metronome.start()
}

处理程序会及时计算节拍器的位置,如果所需的小节数完成(倒数),记录仪将启动。

不幸的是,运行.recordAKNodeRecorder中的.callback handlerAKMetronome会导致警告消息:

Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates.

由于这个原因,在metronome.callback处理程序中开始记录的调用通过GCD API传递给了主线程:

            DispatchQueue.main.sync {
                do {
                    try self.recorder.record()
                } catch {
                    print("[ERROR] Oops! Failed to record...")
                }
            }

我已经使用.sync阻塞方法来尽可能快地解决计算问题,因为定时在音频应用中至关重要(理想情况下,调用应在实时线程中执行);我是否知道GCP API main thread提供了最高优先级,但是我不确定这是否是对时间敏感的应用程序的最佳选择?

如果可能,希望从其他用户那里获得一些反馈或指导,谢谢!

swift multithreading audiokit
1个回答
0
投票

好,所以实际的问题与节拍或倒数无关吗?您真正想知道的是:从后台线程使用sync可以使我更快地进入主线程吗?

如果是这样,基本上没有。这不是sync的含义或含义。async/ sync的差对速度绝对没有影响。如果使用async进入主线程,则它将在空闲时立即上线,因此只要说sync就不会有任何收益。

此外,如果您已经在async后台线程中进入回调,则已经可以造成的任何损害;您的时间现在不精确,除非您口袋里有一个时光机,否则您绝对无能为力。

© www.soinside.com 2019 - 2024. All rights reserved.