首页 > 解决方案 > 环境对象的变化只通知订阅者一次

问题描述

我有一个应用程序,我在其中使用 firebase firestore 和快照侦听器。我使用 Observable Object 类来观察状态。此状态通知订阅视图,以便我删除该实例上的 snapshotListeners。我将它注入到我的视图层次结构中并在某些视图中使用它。我还有一个 signOut 方法,我允许用户注销这会更改下面的 didLogOut 属性。

这是我正在观察的经理

class StatusManager: ObservableObject{

@Published var didLogOut: Bool = false

}

这是我注销用户的地方

                Button(action: {
                
                isLoggedIn = false
                lastLoggedEmail = ""
                lastLoggedUserPassword = ""
                lastLoggedUserType = ""
                
                statusManager.didLogOut = true

                try? Auth.auth().signOut()
                
                navStack.pop(to: .root)
                
            }, label: {
                Text("Sign Out")
                    .font(Font.custom("Roboto-Light", size: 14))
                
            })

问题是,当我退出时,它第一次起作用。订阅的视图会收到有关更改的通知,这会删除快照侦听器,并且用户通过 Auth.auth().signOut() 方法注销。但是,一旦我从注销返回登录屏幕,如果我第二次登录并尝试注销,则不会通知视图关于 didLogOut 中的更改。这会导致我的应用程序崩溃,因为用户通过 firebase 注销但侦听器仍然处于活动状态。侦听器无法访问该数据,因为用户未登录。导致此

Listen for query at adminData/melsaville5@gmail.com/drivers failed: Missing or insufficient permissions.

标签: iosswiftfirebaseswiftui

解决方案


用户重新登录时忘记将 didLogOut 重置为 false。


推荐阅读