我正在尝试制作群聊应用,到目前为止,我已经安装了应用程序(来自教程),以便任何用户都可以创建一个房间,所有这些房间都显示在一个中央列表中,这对所有用户都是一样的。现在我需要改变这一点,以便用户只能看到他们创建或已添加的房间(就像iMessage这样的任何消息传递应用程序)。
这就是创建一个房间并将其附加到Room
对象(并上传到Firebase)的方式:
var rooms: [Room] = []
// Create new room
@IBAction func createRoom(_ sender: Any) {
if let name = newRoomTextField?.text {
let newRoomRef = roomRef.childByAutoId()
let roomItem = [
"name": name
]
newRoomRef.setValue(roomItem)
}
}
private func observeRooms() {
// Observe method to listen for new channels being written to Firebase
roomRefHandle = roomRef.observe(.childAdded, with: { (snapshot) -> Void in
let roomData = snapshot.value as! Dictionary<String, AnyObject>
let id = snapshot.key
if let name = roomData["name"] as! String!, name.characters.count > 0 {
self.rooms.append(Room(id: id, name: name))
self.tableView.reloadData()
} else {
print("Error! Could not decode channel data")
}
})
}
房间对象:
internal class Room {
internal let id: String
internal let name: String
init(id: String, name: String) {
self.id = id
self.name = name
}
}
目前,会议室的表格视图中填充了cell.textLabel?.text = rooms[(indexPath as NSIndexPath).row].name
(cellForRow
方法)和return rooms.count
(numberOfRows
方法),从而返回了应用中的所有会议室,并非特定于用户。
这是我不确定如何继续的地方:我猜测我会添加一个阵列&#34;参与者:[String]&#34;到我的房间对象(除了&#34; id&#34;和&#34;名称&#34;),然后在我observeRooms
的{{1}}中,我还附加了用户对&#34;参与者&#34;?的ID然后仅使用当前用户的id参与的房间填充表格视图?
这是正确的方法吗?
感谢您提供任何帮助/指导!
答案 0 :(得分:1)
我认为这是正确的方法,你基本上有两个选择:
participants
数组存储到每个房间,以便查询此数组包含当前userId
的房间。rooms
数组,允许直接从此数据查询房间。 如果您想要显示参与者列表,第一种方法似乎更有意义,尽管对于许多房间*许多参与者而言,查询可能需要比第二种方法更长的时间来执行。
您也可以同时使用这两种方法同时拥有用户房间的功能和更快的查询时间。