【发布时间】:2021-06-14 07:10:02
【问题描述】:
我的应用程序中有一个注销功能,我想删除应用程序中正在使用的所有侦听器。为此,我使用了一个管理我的侦听器的 Observable Object 类。
class ListenersManager: ObservableObject{
@Published var listeners: [ListenerRegistration?] = []
func removeAllListeners(){
for i in listeners{
if i == nil{}
else{
i!.remove()
}
}
}
}
然后我将它作为 environmentObject 注入到应用程序中
这就是我初始化监听器并将它们添加到我的 listenersManager 的方式
@EnvironmentObject var listenersManager: ListenersManager
@State var driversCollListener: ListenerRegistration?
.onAppear(perform: {
listenersManager.listeners.append(driversCollListener)
driversCollListener = db.collection("adminData").document(email).collection("drivers").whereField("cv", isEqualTo: 1).addSnapshotListener { (snapshot, err) in
if err != nil{fatalError("Could not extract admin's drivers data")}
if driversCollListener != nil{
for driver in snapshot!.documents{
if myDrivers.contains("\(driver.documentID)"){
}else{
myDrivers.append(driver.documentID)
print(myDrivers)
}
}
}
else{}
}
}
这就是我调用删除所有听众的地方
Button(action: {
listenersManager.removeAllListeners()
try? auth.signOut()
navStack.pop(to: .root)
}, label: {
Text("Sign Out")
.font(Font.custom("Roboto-Light", size: 14))
})
但是,这是我点击退出按钮时出现的错误
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
【问题讨论】:
-
不要使用
!,如果变量是nil会崩溃。- 你可以简单地说i?.remove()。同样,说for driver in snapshot?.documents ?? [] -
另外,一组可选参数没有多大意义。您应该声明
@Published var listeners: [ListenerRegistration] = []并且如果它是 nil 则根本不存储侦听器 -
不知道为什么 stackoverflow 不推荐感谢人。谢谢!你是救生员@Paulw11
-
在评论中感谢某人是完全可以的——顺便说一句,不客气。建议不要在问题本身中包含“谢谢”,因为它只是多余的词。
-
@Paulw11 这是一个很好的观察和正确的编码解决方案。您可以将其发布为答案吗?
标签: ios swift firebase google-cloud-firestore swiftui