Ios 编译器在尝试删除所有快照侦听器时发现nil
我的应用程序中有一个注销功能,我想删除应用程序中使用的所有侦听器。为此,我使用一个可观察对象类来管理侦听器Ios 编译器在尝试删除所有快照侦听器时发现nil,ios,swift,firebase,google-cloud-firestore,swiftui,Ios,Swift,Firebase,Google Cloud Firestore,Swiftui,我的应用程序中有一个注销功能,我想删除应用程序中使用的所有侦听器。为此,我使用一个可观察对象类来管理侦听器 class ListenersManager: ObservableObject{ @Published var listeners: [ListenerRegistration?] = [] func removeAllListeners(){ for i in listeners{ if i == nil{}
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
您应该始终尝试消除Swift中的强制操作(展开、向下投射和尝试);每次你使用!要强迫别人做某事,你得冒着撞车的危险。我不是说你不应该使用这些操作,但不要简单地添加一个!以满足编译器的要求。考虑如何安全地完成操作 在代码中,您可以轻松消除强制展开:
func removeAllListeners(){
for i in listeners{
i?.remove()
}
}
具有可选元素类型的数组也没有多大意义;如果元素为nil
,则首先不要将其添加到数组中,因此请使用
@Published var listeners: [ListenerRegistration] = []
func removeAllListeners(){
for listener in listeners{
listener.remove()
}
}
不要使用
如果变量为nil
,它将崩溃-您可以简单地说i?.remove()
。类似地,在快照?文档中为驱动程序设置??[]
此外,一系列选项也没有多大意义。您应该声明@Published var listeners:[ListenerRegistration]=[]
,如果侦听器为nil,则不存储它。我不知道stackoverflow为什么不推荐感谢他人。非常感谢。你是个救生员@paulw11在评论中感谢某人是完全可以的,顺便说一句,不客气。建议不要在你的问题中包含“谢谢”,因为它只是额外的单词。@Paulw11这是一个很好的观察结果,也是一个正确的编码解决方案。你能把它作为答案贴出来吗?
@Published var listeners: [ListenerRegistration] = []
func removeAllListeners(){
for listener in listeners{
listener.remove()
}
}