Swift 4 + AudioKit 4.0.4:如何监听振荡器频率变化事件?
监听AudioKit振荡器频率变化的方法
嘿,针对你的需求,完全不需要用定时器轮询!有两种更优雅的方式来监听oscillator.frequency的变化:
方法1:利用AudioKit自带的参数监听
在AudioKit 4.0.4中,AKOscillator的frequency属于AKDoubleProperty类型,它自带了监听值变化的接口。你可以直接给它设置一个观察者闭包,每次频率改变时都会自动触发:
// 在初始化振荡器后设置监听 oscillator.frequency.setObserver { newValue in print("Frequency updated to: \(newValue)") // 这里可以加入你需要执行的逻辑,比如更新UI、触发自定义事件等 }
这种方法最贴合AudioKit的设计,不需要额外封装,所有对oscillator.frequency的修改(不管是直接赋值还是通过AudioKit的参数调制)都会触发这个闭包。
方法2:封装自定义属性并利用didSet
如果你希望更灵活地控制赋值逻辑,可以自己封装一个带有didSet的属性,所有对频率的修改都通过这个属性来完成:
// 定义自定义属性,关联振荡器的频率 var trackedFrequency: Double { didSet { // 同步到振荡器的频率 oscillator.frequency = trackedFrequency // 频率变化时触发的逻辑 print("Frequency changed to: \(trackedFrequency)") // 也可以发送Notification通知其他组件 NotificationCenter.default.post(name: NSNotification.Name("FrequencyChanged"), object: trackedFrequency) } } // 初始化时同步初始值 trackedFrequency = oscillator.frequency
之后你只需要修改trackedFrequency的值,而不是直接操作oscillator.frequency,每次赋值都会自动触发didSet里的逻辑。如果需要通知其他模块,还可以结合NotificationCenter来广播变化。
为什么不用定时器?
定时器轮询不仅效率低(每隔0.1秒的无效检查),还可能错过频率的快速变化,而且在主线程运行的话还可能影响UI流畅度。上面两种方法都是事件驱动的,只有当频率真正变化时才会执行逻辑,性能和准确性都更好。
内容的提问来源于stack exchange,提问作者Jonas0000
相关产品推荐
相关产品推荐

