firebase中的多个句柄

时间:2017-05-12 03:20:59

标签: ios firebase firebase-realtime-database

我正在使用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以获取要在用户界面上显示的数据。

问题是,如果用户参与了大量的房间,是否观察了所有房间的最佳实践变化?

例如,如果我有roomId1roomId30的30个会话,我想在发生更改时更新UI上的最新消息,是否观察到30个引用有意义?

谢谢。

2 个答案:

答案 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