繁体   English   中英

如何设置 Firebase 以仅观察新数据?

[英]How can I setup Firebase to observe only new data?

我有一个观察功能,可以显示添加到 Firebase 实时数据库的项目。

    func observerMessages(completion: @escaping (FireBaseResponse, MessageDataModel) -> Void) {
    let ref = Database.database().reference().child(FireBaseConstants.Database.messages).queryOrdered(byChild: FireBaseConstants.Database.timestamp).queryEnding(atValue: firstMessageTimestamp)
    ref.observe(.childAdded) { (snapshot) in
        if let dict = snapshot.value as? [String:Any] {
            if let username = dict["username"] as? String,
                let timestamp = dict["timestamp"] as? Int,
                let text = dict["text"] as? String,
                let senderId = dict["senderId"] as? String {
                let message = MessageData(username: username, timestamp: timestamp, text: text, senderId: senderId, messageId: snapshot.key)
                print("observeMessages")
                completion(.success, message)
            }
        }
    }
}

问题是此函数会为数据库中已有的所有项目触发。 所以它检索这个孩子的所有数据。 我希望它检索数据,该数据仅在调用此函数后添加。

Firebase 同步特定位置的数据或针对服务器和客户端之间的特定查询同步数据。 没有内置的 API 来要求只发送新数据。

有几种方法可以在 API 之上完成此用例:

  1. 只将新数据存储在一个位置,并在客户端读取它时将其删除。 这是在 Firebase 上实现消息传递的常用方法:为每个客户端编写一个消息队列,并让客户端在处理数据时删除数据。

  2. 只查询自客户端上次读取数据以来写入的数据。 这需要你有一个createdAtupdatedAt每个子节点上的时间戳属性,您存储lastReadDataAt在客户端时间戳。 现在,当客户端连接时,它会运行一个按属性排序的查询,并传入上次同步的时间戳。 使用这些参数,数据库将只返回自客户端上次读取以来创建/更新的数据。

  3. 仅请求一项最近的项目。 这意味着您按某个时间顺序键(例如childByAutoId生成的键)对数据进行childByAutoId ,然后使用limitQuery(toLast:1)从数据库中仅请求一个最近的子节点。 这样,您只能获得一个最近的子节点。 虽然这适用于某些情况,但我几乎从不使用它,因为当客户端失去连接时,您可能会丢失发生的事件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM