You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:45:34