ios - 如何检查 firebase 子节点的特定值(UID)?

标签 ios swift firebase firebase-realtime-database

我正在尝试查询 Firebase 以检查当前用户的 uid 是否列在房间的“参与者”中。如果是这样,我会获取该房间的信息。

下面是我当前的观察者,它监听应用程序中的所有房间,而不仅仅是用户参与的房间。但是我需要先进行检查,查看当前用户的 UID 在哪些房间中列出;如果匹配(uid 在房间的参与者中),则获取该房间的数据:

private func observeRooms() {

    guard let uid = FIRAuth.auth()?.currentUser?.uid else {print("Error getting user UID"); return}

    roomRefHandle = roomRef.observe(.childAdded, with: { (snapshot) -> Void in

        let roomData = snapshot.value as! Dictionary<String, AnyObject>
        let id = snapshot.key
        guard let name = roomData["roomName"] as! String! else {print("Error getting user name"); return}

        self.usersRooms.append(Room(id: id, name: name, participants: [uid]))

        self.tableView.reloadData()
    })
}

这是房间在数据库中的结构:

"rooms" : {
    "-Ki6TJWO-2R1L4SyhSqn" : {
      "messages" : {
        "-Ki6TWrXxWqjaRJAbyVt" : {
          "senderId" : "tzfHgGKWLEPzPU9GvkO4XE1QKy53",
          "senderName" : "Timothy",
          "text" : "Room One message"
        }
      },
      "participants" : {
        "tzfHgGKWLEPzPU9GvkO4XE1QKy53" : true
      },
      "roomName" : "Room One"
    },
    "-Ki6TKOnmToeUuBzrnbb" : {
      "participants" : {
        "tzfHgGKWLEPzPU9GvkO4XE1QKy53" : true
      },
      "roomName" : "Room Two"
    },
    "-Ki6TLGC1Encm1v-CbHB" : {
      "participants" : {
        "tzfHgGKWLEPzPU9GvkO4XE1QKy53" : true
      },
      "roomName" : "Room Three"
    }
   }

我如何更改我的函数,以便它在获取值之前首先检查所有房间的参与者是否有当前用户的 uid?

感谢您的任何建议!

编辑:Jay 的方法:

private func observeRooms() {

    guard let uid = FIRAuth.auth()?.currentUser?.uid else {print("Error getting user UID"); return}
    let queryRef = roomRef.queryOrdered(byChild: "participants/\(uid)").queryEqual(toValue: true)

    queryRef.observe(.childAdded, with: { snapshot in

        let roomDict = snapshot.value as! [String: AnyObject]

        let id = snapshot.key

        let roomName = roomDict["roomName"] as! String
        let participants = roomDict["participants"] as! [String: AnyObject]
        let numberOfParticipants = participants.count

        print("\nRoom Name: \(roomName)")
        print("Participants: \(participants)")
        print("Room ID: \(id)\n")

        self.usersRooms.append(Room(id: id, name: roomName, participants: [uid]))
        self.tableView.reloadData()
    })
}

最佳答案

为了保持 super 简单,在用户所属的每个房间中存储对用户的引用。

rooms
  room_0
   room_name: "My Room"
   users
    user_1: true
    user_2: true
  room_1
   room_name: "Their Room"
   users
    user_1: true

然后一个简单的查询将收集所有需要的数据,并且还会附加一个观察者,因此如果该用户加入任何新房间,应用程序将收到通知。

let roomsUsersRef = self.ref.child("rooms")
let queryRef = roomsUsersRef.queryOrdered(byChild: "users/user_1").queryEqual(toValue: true)

queryRef.observe(.childAdded, with: { snapshot in

    let roomDict = snapshot.value as! [String: AnyObject]
    let roomName = roomDict["room_name"] as! String

    let usersDict = roomDict["users"] as! [String: AnyObject]
    let userCount = usersDict.count

    print("Room: \(roomName) has \(userCount) users")
})

和输出

Room: My Room has 2 users
Room: Their Room has 1 users

您可以使用 .childChanged 和 .childRemoved 对此进行扩展,以跟踪该用户所属房间中发生的任何事件。因此,如果另一个用户加入或离开该用户所在的房间,应用程序将收到通知;如果房间的所有者将此用户从房间引导,该应用程序也会收到通知。

关于ios - 如何检查 firebase 子节点的特定值(UID)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43503726/

相关文章:

ios - 如何在iOS8中使用MKMapView "Shows User Location"?

ios - UIMenuController 不显示菜单

ios - 将图像上传到 S3 无法完成上传

ios - 变量作用域不是我想要的?

firebase - 无法确定 Firestore REST API 调用的正确顺序以使用事务更新文档

ios - 每天以快速语法更新

ios - 使用 iOS 7 测试版设备制作 iOS 6 应用程序

ios - 在 UICollectionView 中没有开关的 Deque 可重用单元格

ios - Firebase 云函数始终返回 Null

javascript - 无法进入 JavaScript 中的函数