Swift 使用侦听器的通用例程创建Firebase引用数组
我想创建一个Firebase实例数组,每个实例都有启动相同例程的侦听器 例如:假设数据存储在根目录下,如下所示:Swift 使用侦听器的通用例程创建Firebase引用数组,swift,firebase,Swift,Firebase,我想创建一个Firebase实例数组,每个实例都有启动相同例程的侦听器 例如:假设数据存储在根目录下,如下所示: https://someapp.firebaseio.com/chatrooms/RoomFoo/John/... https://someapp.firebaseio.com/chatrooms/RoomFoo/Mary/... .. .. https://someapp.firebaseio.com/chatrooms/RoomBar/Alice/... https://some
https://someapp.firebaseio.com/chatrooms/RoomFoo/John/...
https://someapp.firebaseio.com/chatrooms/RoomFoo/Mary/...
..
..
https://someapp.firebaseio.com/chatrooms/RoomBar/Alice/...
https://someapp.firebaseio.com/chatrooms/RoomBar/Bob/...
每个房间内的成员都有一个侦听器(childAdded和childRemoved),用于该房间内的每个用户
假设Adam加入RoomFoo,会发生以下情况:
- Adam获取当前数据
- Adam将侦听器设置为用户John和用户Mary:如果这些用户 在屏幕下添加或删除数据
- Adam在RoomFoo设置了监听器,这样他就可以处理任何需要的新用户 加入
- 约翰和玛丽让RoomFoo的听众为新用户点火 (亚当)谁刚加入
- John和Mary为Adam设置了侦听器,以处理Adam添加或删除的数据 在他下面移动
func userJoinedRoom(snapshot: FDataSnapshot!) {
print(snapshot.key + " Joined!")
let firebaseRootRef = Firebase(url: firebaseRootUrl)
let roomsRootRef = firebaseRootRef.childByAppendingPath(roomsRelativePath)
let userRoomRef = roomsRootRef.childByAppendingPath(snapshot.key)
//read initial data as well : TODO
allUserRef.append(userRoomRef)
print(allUserRef) //Works great - i can see a list of references
userRoomRef.observeEventType(.ChildAdded, withBlock: userAddedData)
userRoomRef.observeEventType(.ChildRemoved, withBlock: userRemovedData)
}
问题是userAddedData和userRemovedData从未被调用
我的错误是什么?我通过维护字典中的句柄(按用户ID索引),而不是像Jay在评论中指出的那样维护Firebase实例,解决了我的问题为什么不只是在/聊天室中设置一个观察者,而不是拥有几十个单独的观察者?如果观察到/聊天室,则无论何时添加(或更改)用户或用户数据,应用程序都会收到通知,如果新添加的用户与当前用户在同一个聊天室中,则会采取所需的任何操作(例如使用其名称更新UI),否则忽略事件。它可以降低一个级别,只观察用户所在的房间,而不是所有用户(上一个级别)或单个用户(下一个级别)哦,你为什么要保留一个引用数组?添加观察者后,它会“粘住”该节点,直到您将其移除。如果您仍然需要这些“引用”来删除观察者,您可能希望查看Firebase句柄并将它们保留在一个数组中:var handle=ref.observeEventType(.Value,withBlock:{snapshot in…嗨,Jay,我打算让每个用户都有一个观察者是因为一个用户可能正在其根目录下生成/修改大量内容。据我所知,房间名称上的firebase侦听器不会只向我提供新的/更改的数据,而是提供它下面树中的全部内容,因此需要我o在客户端找出哪些数据是新的/更改的。因此,有动机创建单独的观察者。这是您不推荐的吗?您能建议我如何处理上述困境吗?
func userJoinedRoom(snapshot: FDataSnapshot!) {
print(snapshot.key + " Joined!")
let firebaseRootRef = Firebase(url: firebaseRootUrl)
let roomsRootRef = firebaseRootRef.childByAppendingPath(roomsRelativePath)
let userRoomRef = roomsRootRef.childByAppendingPath(snapshot.key)
//read initial data as well : TODO
allUserRef.append(userRoomRef)
print(allUserRef) //Works great - i can see a list of references
userRoomRef.observeEventType(.ChildAdded, withBlock: userAddedData)
userRoomRef.observeEventType(.ChildRemoved, withBlock: userRemovedData)
}