[英]How does $ work in SwiftUI and why can I cast a @StateObject to an @ObservedObject
[英]how can i throttle changes to stateobject in swiftui
我有一个执行昂贵更新的视图,所以我想限制它们:
目前我的看法是这样的:
struct CodeGenerationView: View {
@StateObject var root: RootState
var body: some View {
Text(CodeGenerator.generate(root: root))
}
}
所以每次更新都会调用它。
我想限制更改以每秒仅更新一次
这可能吗?
如果您可以将代码生成移至ObservableObject
本身,那将是最简单的:
class RootState : ObservableObject {
@Published var result : String = ""
private var cancellables = Set<AnyCancellable>()
init() {
Timer.publish(every: 1, on: .main, in: .default)
.autoconnect()
.sink { (_) in
//perform some expensive calculation here
self.result = "\(Date().timeIntervalSince1970)"
}
.store(in: &cancellables)
}
}
struct CodeGenerationView: View {
@StateObject var root: RootState
var body: some View {
Text(root.result)
}
}
请注意,我正在使用 Combine 来连接计时器发布者。 如果由于某种原因您无法在 RootState 中生成代码,则使用 Combine 将 Publishers 连接在一起可能是 go 的方法。 在这种情况下,您几乎可以肯定实际上不需要它,但甚至还有一种throttle
方法: https://developer.apple.com/documentation/combine/fail/throttle(for:scheduler:latest:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.