【问题标题】:How can I setup Firebase to observe only new data?如何设置 Firebase 以仅观察新数据?
【发布时间】:2020-03-04 00:10:54
【问题描述】:

我有一个观察功能,可以显示添加到 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)
            }
        }
    }
}

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

【问题讨论】:

  • 该函数将为数据库中符合条件的每个项目触发一次(例如,它允许您填充 tableView 数据源),此后仅对添加的新子项触发。只需更改您的条件以返回具有当前调用函数时间之后的时间戳的子项。它不会立即返回任何孩子,之后只会返回新的孩子。

标签: ios swift firebase


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    相关资源
    最近更新 更多