【发布时间】:2021-03-17 14:52:13
【问题描述】:
我有这个应用程序,我正在使用 firebase firestore 实现注销功能。我想要做的是在用户注销时分离我所有的快照监听器。我使用 environmentObject 来观察用户何时注销。
class StatusManager: ObservableObject{
@Published var didLogOut: Bool = false
}
我将对象注入到环境中。然后,我在每个具有侦听器的视图中捕获对象。
@EnvironmentObject var statusManager: StatusManager
这就是我计划在用户注销后分离监听器的方式。
.onAppear(perform: {
if statusManager.didLogOut == false{
notifyListener = db.collectionGroup("resources").whereField("control", isEqualTo: true).addSnapshotListener { (snapshot, err) in
//All the functionality
}
}
else{
notifyListener?.remove()
}
})
这是用户注销的地方。
Button(action: {
isLoggedIn = false
lastLoggedEmail = ""
lastLoggedUserType = ""
lastLoggedUserPassword = ""
statusManager.didLogOut = true
try? Auth.auth().signOut()
navStack.pop(to: .root)
}, label: {
Text("Sign Out")
.font(Font.custom("Roboto-Light", size: 14))
})
问题是,一旦改变了 didLogOut 状态,我使用快照侦听器的代码就永远不会重新读取。因此,快照监听器永远不会被移除。
【问题讨论】:
-
看起来像是架构问题。如果
StatusManager不是为了管理登录状态,为什么不在其上创建一个名为login或logout的函数来执行与登录/注销相关的所有操作(例如添加侦听器)。然后,不要在视图中管理您的登录状态 (isLoggedIn),而是在您的StatusManager上设置一个@Published参数。您可能完全摆脱了didLogOut。
标签: ios swift firebase swiftui