【问题标题】:Delete document from cloud firestore从 Cloud Firestore 中删除文档
【发布时间】:2021-10-16 01:17:18
【问题描述】:

我正在尝试实现一个功能,允许用户删除他们与其他用户的聊天。

目前代码工作并且firestore文档被成功删除但是一旦删除发生代码崩溃并且我得到这个错误“致命错误:在展开可选值时意外发现nil”旁边的id = data !["id"] 在代码中。我猜想在删除发生后,firestore 会继续监听文档并在删除后找到一个空集合。有谁知道如何阻止这种情况发生?

  public func deleteConversation(conversationId: String, completion: @escaping (Bool) -> Void) {
    // Get all conversations for current user
    
    let CurrentUser = Auth.auth().currentUser?.uid
    let db = Firestore.firestore()
    
    let ConversationRef = db.collection("users").document(CurrentUser!).collection("conversations").document(test!)
    
    print("deleting conversation with \(test!)")
    
    ConversationRef.addSnapshotListener { snapshot, error in
        guard let document = snapshot else {
            print("Error getting documents: \(String(describing: error))")
            return
        }
        let data = document.data()
        if let id = data!["id"] as? String, id == conversationId {
            print("conversation found")
            ConversationRef.delete()
       }
        completion(true)
        print("deleted conversation")
    }
    
}

【问题讨论】:

    标签: swift firebase google-cloud-firestore


    【解决方案1】:

    问题来自:

    ConversationRef.addSnapshotListener { snapshot, error in
    

    通过调用addSnapshotListener,您添加了一个监听器:

    1. 立即获取文档快照,
    2. 继续侦听更改并再次调用您的代码然后有任何变化。

    问题出在#2,因为这意味着您的代码在文档被删除时再次执行,此时document.data() 将是nil

    最简单的解决方法是只使用read the document once

    ConversationRef.getDocument { (document, error) in
    

    【讨论】:

    • 啊,我明白了,这很有道理!谢谢弗兰克?
    猜你喜欢
    • 2020-12-11
    • 2021-03-16
    • 2018-06-18
    • 2018-03-22
    • 2018-08-02
    • 2020-09-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    相关资源
    最近更新 更多