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

iOS 17中@Observable替代Combine onReceive的等效方法问询

在iOS 17+中用@Observable替代Combine的onReceive方法

核心解决方案:使用.onChange(of:)监听属性变化

在iOS 17引入的@Observable宏体系下,无需依赖Combine的onReceive,直接用SwiftUI原生的.onChange(of:)就能实现等效的属性变化监听,且在之前onReceive生效的场景(比如根视图、应用状态切换等)同样适用。

针对你提供的代码,修改后的实现如下:

struct ContentView: View {
    @State private var vm = ContentViewModel()
    
    var body: some View {
        VStack {
            Button(action: {
                vm.number += 1
            }, label: {
                Text("\(vm.number)")
            })
        }
        // 替代onReceive的写法
        .onChange(of: vm.number) { newValue in
            print("onChange: \(newValue)")
        }
    }
}

@Observable
final class ContentViewModel {
    var number = 0
}

为什么@Bindable不适用?

@Bindable的核心作用是创建属性绑定(Binding),用于将Observable对象的属性关联到UI控件上,它本身不提供属性变化的回调逻辑,因此在需要监听变化并执行自定义代码的场景下,.onChange(of:)是更合适的替代方案。

进阶:监听整个Observable对象的所有属性变化

如果需要监听对象的任意属性变化(而非单个属性),可以直接监听对象本身:

.onChange(of: vm) { _ in
    print("ViewModel的某个属性发生了变化")
}

这种方式会在对象的任何属性修改时触发,适合需要统一处理所有属性变化的场景。


内容的提问来源于stack exchange,提问作者Tài Lê

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:23:10