根据观察变量的变化更新@Published 变量

Ben*_*ess 4 swift combine

我有一个可以观察到的 AppState:

class AppState: ObservableObject {

    private init() {}
    static let shared = AppState()

    @Published fileprivate(set) var isLoggedIn = false

}
Run Code Online (Sandbox Code Playgroud)

视图模型应该根据状态 ( isLoggedIn)决定显示哪个视图:

class AppState: ObservableObject {

    private init() {}
    static let shared = AppState()

    @Published fileprivate(set) var isLoggedIn = false

}
Run Code Online (Sandbox Code Playgroud)

最后 aHostView观察该containedView属性并根据它显示正确的视图。

我的问题是isLoggedIn上面的代码没有被观察到,我似乎无法找到一种方法来做到这一点。我很确定有一个简单的方法,但是经过 4 个小时的反复试验,我希望这里的社区可以帮助我。

Ben*_*ess 5

工作解决方案:

在使用 Combine 两周后,我现在再次修改了我以前的解决方案(请参阅编辑历史记录),这是我现在能想到的最好的解决方案。这仍然不完全是我的想法,因为contained不是同时订阅者和发布者,但我认为AnyCancellable总是需要的。如果有人知道实现我的愿景的方法,请仍然告诉我。

class HostViewModel: ObservableObject, Identifiable {

    @Published var contained: DisplayableContent
    private var containedUpdater: AnyCancellable?

    init() {
        self.contained = .welcome
        setupPipelines()
    }

    private func setupPipelines() {
        self.containedUpdater = AppState.shared.$isLoggedIn
            .map { $0 ? DisplayableContent.mainContent : .welcome }
            .assign(to: \.contained, on: self)
    }

}

extension HostViewModel {

    enum DisplayableContent {
        case welcome
        case mainContent
    }

}
Run Code Online (Sandbox Code Playgroud)