Swift Firebase:识别数据库中的变化

时间:2018-03-10 11:39:36

标签: ios firebase firebase-realtime-database

我正在编写聊天应用程序并尝试实现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?

1 个答案:

答案 0 :(得分:1)

还有另一个观察员功能只适用于你的情况

来自Firebase Docs

  

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