微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检查多个@Published 值

如何解决检查多个@Published 值

我有 3 个班级:

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 时,我需要做一些事情

这当然是我的文件的简化版本:每个类的加载变量通过下载方法设置为真或假。 我只需要检查所有下载是否已完成并删除加载视图。

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,{ $0 && $1 && $2 })) { loading in
    self.loading = loading
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。