检查多个@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
}
我有 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
}