【发布时间】:2017-04-18 13:57:38
【问题描述】:
我的观察者会监听 Firebase 中添加的新 rooms,然后在添加时更新本地数组。它的工作原理是当我向 Firebase 添加一个房间时,其中两个房间被添加到阵列中。例如,如果我在 Firebase 中有 4 个房间(房间 1、房间 2 等),当应用程序加载时,表格视图中有 8 个房间(两个房间 1、两个房间 2 等)。然后添加,例如,五号房间,两个五号房间会出现。
private func observeRooms() {
guard let uid = FIRAuth.auth()?.currentUser?.uid else {print("Error getting user UID"); return}
let userRoomRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").child(uid).child("rooms")
userRoomRef.observe(.childAdded, with: { (roomSnap) in
for eachRoom in roomSnap.value as! [String : AnyObject] {
let roomID = eachRoom.key as! String
print("Roomsnap 2 (observer): \(roomSnap.value)")
if let roomInfo = roomSnap.value as? [String : AnyObject] {
guard let roomName = roomInfo["roomName"] as! String! else {print("Error getting room name"); return}
guard let participants = roomInfo["participants"] as! [String]! else {print("Error getting room participants"); return}
print("\n\nRoom Name: \(roomName)\nRoom Participants: \(participants)\nRoom ID: \(roomID)\n")
self.usersRooms.append(Room(id: roomID, name: roomName, participants: participants))
print("User's Rooms: \(self.usersRooms)\n")
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
})
}
为什么数据被提取两次?有没有办法编写只读取每个房间一次的函数?
Firebase 数据库 JSON:
"tzfHgGKWLEPzPU9GvkO4XE1QKy53" : {
"gender" : "male",
"handle" : "TestHandleOne",
"name" : "Timothy",
"profilePicture" : "https://graph.facebook.com/*removed*/picture?type=large&return_ssl_resources=1",
"rooms" : {
"-KhY2GnJOxBwdPK669ui" : {
"participants" : [ "tzfHgGKWLEPzPU9GvkO4XE1QKy53" ],
"roomName" : "Room One"
},
"-KhY2Hnz48lTtRpzmBuw" : {
"participants" : [ "tzfHgGKWLEPzPU9GvkO4XE1QKy53" ],
"roomName" : "Room Two"
},
"-KhY2IZL4l16dMxGopt6" : {
"participants" : [ "tzfHgGKWLEPzPU9GvkO4XE1QKy53" ],
"roomName" : "Room Three"
},
"-KhY8SdHnkfI7bZIpyjI" : {
"participants" : [ "tzfHgGKWLEPzPU9GvkO4XE1QKy53" ],
"roomName" : "Room Four"
}
}
}
roomSnap.value 打印到控制台,每个房间打印两次,房间 ID 的值不同。例如这里是一号房间:
工作函数(最终编辑):
private func observeRooms() {
guard let uid = FIRAuth.auth()?.currentUser?.uid else {print("Error getting user UID"); return}
let userRoomRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").child(uid).child("rooms")
roomRefHandle = userRoomRef.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]))
// Add new room to "rooms" in Firebase
let roomDict = ["roomName" : name, "participants": [uid]] as [String : Any]
let newRoomRef = self.roomRef.child(id)
newRoomRef.setValue(roomDict)
self.tableView.reloadData()
})
}
【问题讨论】:
-
你在哪里调用
observeRooms方法? -
在
viewDidAppear -
该代码中有很多冗余,并且 .childAdded 观察者没有被正确使用 - 请参阅我的答案。
标签: ios swift firebase firebase-realtime-database