如何使用 onDisconnectUpdateChildValues 在 firebase 上更新数组

How to update an array on firebase using the onDisconnectUpdateChildValues

我想在用户断开连接后从一组用户中删除该用户(实时 firebase)。

例如:John 崩溃了,所以删除 johns 节点并重新排序索引。请检查图像。

let connectedRef = Database.database().reference(withPath: ".info/connected")
    
    connectedRef.observe(.value, with: { snapshot in
        
        guard let connected = snapshot.value as? Bool, connected else {
            completion(false)
            return
        }
        
        self.database.child("\(groupChatId)_F/users").onDisconnectUpdateChildValues([ ??? ]){ (error, ref) in
            if let error = error {
                print("\(error)")
            }
            completion(true)
        }
    })

我不确定是否有可能做这样的事情。如果我的直觉是正确的,那么请提供有关如何解决问题的建议。

首先:像您在此处使用的数组这样的数组是 Firebase 中的一种反模式。我强烈推荐阅读 Best Practices: Arrays in Firebase.

但除此之外:要在断开连接时更新,您需要指定两件事:

  1. 您要写入的确切、完整的路径。
  2. 您要写入该路径的确切值。

假设您要删除 users/2 处的 value/path 我建议使用:

self.database.child("\(groupChatId)_F/users/2").onDisconnectRemoveValue(){ (error, ref) in
  ...

这确实意味着您需要知道用户的路径(此示例代码中的2)。如果您目前不知道该路径,您有两个主要选择:

  • 要么在创建子节点时在代码中记住它。所以当你添加"Bob"的时候,记得在你的代码中,你在节点2.

    中添加了他
  • 或者您可以使路径幂等。例如,如果您的用户名是唯一的,我建议将它们存储在这样的结构中:

    "users": {
      "Alex": true,
      "Bob": true,
      "John": true
    }