我有三个类:
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
时,我需要做一些事情
当然,这是我的文件的简化版本:通过下载方法将每个类的加载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()
}
}
}
有什么建议吗?
您可以使用computed属性。
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, { $0 && $1 && $2 })) { loading in
self.loading = loading
}