我如何在 swiftui 中限制对 stateobject 的更改

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 将 Publisher 连接在一起可能是可行的方法。在这种情况下你几乎肯定不会真正需要它,但甚至还有一个 throttle 方法:https://developer.apple.com/documentation/combine/fail/throttle(for:scheduler:latest:)