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ê
相关产品推荐
相关产品推荐

