我正在编写聊天应用程序并尝试实现readReceipts。我有以下Firebase数据库结构,当打开一条消息时,我将执行updateChildValue
。这会将Bool更新为true,如下所示:
Snap (messages) {
"-L7E-3km6bvx3WWFHeuj" = 1;
"-L7E-MXzwmZ9iv6Bj0oM" = 1;
"-L7E-N5pm-FGtb3m3AOr" = 1;
"-L7E-Q2cRJz9DDFgRWL_" = 1;
"-L7E-U4r1vd94i-xbNTh" = 1;
"-L7E1LdrJaqZDjIkWd7X" = 1;
"-L7EBz3hxfJ-E3f7joJ6" = 1;
"-L7EE8A5eZNyey12GcHB" = 1;
"-L7EEwX2m-rrPYFgDoA8" = 0;
"-L7EFA7CHfyRoECUkeLm" = 0;
"-L7EFPICxdWQcrLOEUkM" = 0; //Updating this will change Bool to 1
"-L7EJ1byG2KLKZf_Cspv" = 0;
"-L7EKRmXYz_94UrIPGhS" = 0;
}
我在childChanged
节点上收听messages
,当更新更改为true
时,我会更新collectionViewCells
的观看次数。但是,实现childChanged
将始终提取整个消息节点。
有没有办法确定哪个id到哪个获取更新,从而获得indexPath来更新collectionViewCells
?或者,有没有更好的方法来实现readReceipts?
答案 0 :(得分:1)
还有另一个观察员功能只适用于你的情况
observeEventType:andPreviousSiblingKeyWithBlock:习惯了 监听特定位置的数据变化。这是主要的 从Firebase数据库中读取数据的方法。你的街区将是 触发初始数据,并在数据发生变化时再次触发。在 另外,对于FIRDataEventTypeChildAdded,FIRDataEventTypeChildMoved, 和FIRDataEventTypeChildChanged事件,你的块将被传递 按优先级顺序排列前一个节点的密钥。
func observe(_ eventType: DataEventType, andPreviousSiblingKeyWith block: @escaping (DataSnapshot, String?) -> Void) -> UInt
示例:
Database.database().reference().child("messages").observe(.childChanged) { (snapshot, key) in
print(key)
//"-L7EFPICxdWQcrLOEUkM"
}