我一直在研究如何实现节拍器倒计时,但是遇到了与线程和实现有关的问题。
我的实现使用AudioKit AKMetronome
,一种处理metronome.start
的方法,并且metronome.callback
处理程序在给定数量的小节完成后启动recording
。
init () {
metronome.callback = handler
}
func record () {
self.metronome.start()
}
处理程序会及时计算节拍器的位置,如果所需的小节数完成(倒数),记录仪将启动。
不幸的是,运行.record
的AKNodeRecorder
中的.callback handler
的AKMetronome
会导致警告消息:
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
提供了最高优先级,但是我不确定这是否是对时间敏感的应用程序的最佳选择?
如果可能,希望从其他用户那里获得一些反馈或指导,谢谢!
好,所以实际的问题与节拍或倒数无关吗?您真正想知道的是:从后台线程使用sync
可以使我更快地进入主线程吗?
如果是这样,基本上没有。这不是sync
的含义或含义。async
/ sync
的差对速度绝对没有影响。如果使用async
进入主线程,则它将在空闲时立即上线,因此只要说sync
就不会有任何收益。
此外,如果您已经在async
后台线程中进入回调,则已经可以造成的任何损害;您的时间现在不精确,除非您口袋里有一个时光机,否则您绝对无能为力。