繁体   English   中英

我如何限制 swiftui 中状态对象的更改

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM