检查多个@Published 值

Check multiple @Published values

我有 3 个 classes:

class ClassOne: ObservableObject {
    @Published var loading: Bool = false
}

class ClassTwo: ObservableObject {
    @Published var loading: Bool = false
}

class ClassThree: ObservableObject {
    @Published var loading: Bool = false
}

在 SwiftUI 视图中,当所有 loading 变量都是 true

时,我需要做一些事情

这当然是我文件的简化版本:每个 class 的加载 var 由下载方法设置为 true 或 false。 我只需要一些东西来检查是否所有下载都已完成并删除加载视图。

struct MainScreen3: View {
    @State private var cancellables = Set<AnyCancellable>()
    @EnvironmentObject var classOne: ClassOne
    @EnvironmentObject var classTwo: ClassTwo
    @EnvironmentObject var classThree: ClassThree
    
    @State private var loading: Bool = true
    
    var body: some View {
        VStack {
            if loading {
                Text("Please wait...")
            } else {
                Text("Done!")
            }
            
        }.onAppear {
            self.classOne.fetchFromServer()
            self.classTwo.fetchFromServer()
            self.classThree.fetchFromServer()
        }
    }
}

有什么建议吗?

您可以使用计算的 属性。

private var loading: Bool {
   (self.classOne.loading || self.classTwo.loading || self.classThree.loading)
}

您可以使用 combineLatest 将所有 3 个加载值合并为一个 Publisher。您可以在视图上使用 onReceive 订阅此发布者并更新现有 loading State 属性 以触发 UI 更新。

.onReceive(classOne.$loading.combineLatest(classTwo.$loading, classThree.$loading, { [=10=] &&  &&  })) { loading in
    self.loading = loading
}