Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用侦听器的通用例程创建Firebase引用数组_Swift_Firebase - Fatal编程技术网

Swift 使用侦听器的通用例程创建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

我想创建一个Firebase实例数组,每个实例都有启动相同例程的侦听器

例如:假设数据存储在根目录下,如下所示:

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添加或删除的数据 在他下面移动
如果我构建一个Firebase引用数组,我可以添加/删除对该数组的引用并设置侦听器,但是这些侦听器永远不会被调用

这就是数组的声明方式(Swift)

将引用附加到此数组并设置侦听器的逻辑

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)
    }