【问题标题】:Firebase ObservableObject not updating after app goes asleep in swiftui应用程序在 swiftui 中进入睡眠状态后,Firebase ObservableObject 未更新
【发布时间】:2022-07-09 01:25:43
【问题描述】:

我有一个设置为 ObservableObject 的类来监听 Firestore 集合。一切正常,直到应用程序进入睡眠状态(例如 30 分钟后)并且云函数运行以更新一些数据。然后,在我杀死并再次打开应用程序之前,不再发生实时更新,只有在那之后我才能获得最新的更新。

我的代码是这样工作的:

class FirebaseRealTime: ObservableObject {
..

@Published var myUsers = [Users]()
..

self.listenToUserCollection()
..

func listenToUserCollection {
        db.collection("users").addSnapshotListener { (querySnapshot, error) in
DispatchQueue.global(qos: .background).async {
..
          DispatchQueue.main.async {
                        self.myUsers = tempUsers
                        //self.usersLoaded = true
          }
..
       }

}

然后我有一个接收实时数据的 SwiftUI 视图。

struct ViewExample: View {
    @EnvironmentObject var userDetails:FirebaseRealTime
    
    @State var users:[Users] = []
    
    var body: some View {
        VStack {
            ScrollView {
                ForEach(users) { user in
                    RowExample(user: user)
                }
            }
        }
        .onReceive(userDetails.$myUsers) { data in
             print (data) 
        }
    }
}

正如我所说,当应用程序处于活动状态并且我手动更改 Firestore 中的一个字段时,数据会更新,但当 Google Cloud 函数在后端运行时它不会。

知道发生了什么吗?有没有办法“强制”接收到的数据进行更新,或任何其他解决方法?

【问题讨论】:

    标签: firebase google-cloud-firestore swiftui google-cloud-functions combine


    【解决方案1】:

    查看您遇到的主要问题,似乎您应该使用StateObject,而不是使用ObservedObject

    由于 SwiftUI 可以随时构建或销毁视图,因此在其中创建一个 @ObservedObject 是很危险的。为了保证视图重绘时的一致结果,请使用 @StateObject 包装器,除非您将 @ObservedObject 作为依赖项注入。

    指导原则是,无论哪个视图首先创建您的对象,都必须使用@StateObject 通知 SwiftUI 它是数据的所有者并负责维护它。所有其他视图必须使用@ObservedObject 向 SwiftUI 表明他们想要密切关注对象的更改但不直接拥有它。

    虽然@StateObject 和@ObservedObject 共享许多特征,但SwiftUI 以不同的方式管理它们的生命周期。为了保证当前视图生成观察对象时的一致结果,请使用状态对象属性包装器。每当您将观察到的对象作为依赖项注入时,您都可以使用@ObservedObject

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      相关资源
      最近更新 更多