我正在使用iOS中的房间功能构建聊天应用,并构建了一个Firebase数据设计:
"members" : {
"userId1" : {
"roomId1" : true
},
"userId2" : {
"roomId1" : true
}
}
"rooms" : {
"roomId1" : {
"lastMessage" : "Last message",
"timeStamp" : 1494483604,
//users in this room
"users" : {
"userId1" : true,
"usreId2" : true
}
}
}
因此,为了显示用户的对话列表,首先我会观察路径members/userId
的类型值的单个事件,以获取用户参与的房间列表。
然后,对于每个roomId
,我会观察rooms/roomId
以获取要在用户界面上显示的数据。
问题是,如果用户参与了大量的房间,是否观察了所有房间的最佳实践变化?
例如,如果我有roomId1
到roomId30
的30个会话,我想在发生更改时更新UI上的最新消息,是否观察到30个引用有意义?
谢谢。
答案 0 :(得分:1)
这不是最佳做法,但这是一种有效的做法。但是,根据您的结构,在房间节点上为任何users / userIdx:true生成查询会更简单。
这将向一个节点添加和观察者,并通知应用程序用户所属房间的任何更改。
例如
给定结构
rooms
room_0
room_name: "My Room"
users:
uid_0: true
uid_1: true
uid_2: true
room_1
room_name: "Romper Room"
users:
uid_0: true
uid_2: true
以及添加观察者以观察uid_1的一些代码
let roomsRef = self.ref.child("rooms")
roomsRef.queryOrdered(byChild: "users/uid_1").queryEqual(toValue: true)
.observe(.childAdded, with: { (snapshot) in
let roomDict = snapshot.value as! [String: AnyObject]
let roomName = roomDict["room_name"] as! String
print(roomName)
})
首次运行此代码时,将打印出
My Room
因为用户是My Room(room_0)的一部分,而不是room_1的一部分。
如果您再将uid_1:true添加到room_1,则会打印
Romper Room
答案 1 :(得分:0)
您应该使用observe
更新数据库更改,以便根据观察结果更新UI。
看看这个文件:
https://firebase.google.com/docs/database/ios/read-and-write