【问题标题】:Compiler finds nil while trying to remove all snapshotListeners编译器在尝试删除所有快照侦听器时发现 nil
【发布时间】: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


【解决方案1】:

您应该始终尝试在 Swift 中消除强制操作(展开、向下转换和尝试);每次使用!强迫你冒着崩溃的风险。我并不是说你不应该使用这些操作,但不要简单地添加一个!以满足编译器。想一想如何安全地完成操作。

在您的代码中,您可以轻松消除强制展开:

func removeAllListeners(){
    
    for i in listeners{
       i?.remove()
    }
}

 if driversCollListener != nil{
        
    for driver in snapshot?.documents ?? []{
            
    if !myDrivers.contains("\(driver.documentID)"){
        myDrivers.append(driver.documentID)
        print(myDrivers)    
    }
}

具有可选元素类型的数组也没有多大意义;如果元素是nil,一开始就不要添加到数组中,所以使用

@Published var listeners: [ListenerRegistration] = []

func removeAllListeners(){
    
    for listener in listeners{
       listener.remove()
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2021-10-30
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多