我正在将数据写入实时数据库,如下所示:

function writeData {
        guard let uid = Auth.auth().currentUser?.uid else { return }
        let databaseRef = Database.database().reference().child("users/\(uid)")

        let object = [
            ...
            ] as [String: Any]

        databaseRef.setValue(object)
}

它工作正常,但我目前正在努力减少数据丢失杀死应用程序的可能性。为此,我最近浏览了网页,发现了一个名为“离线查询数据”的代码:
let scoresRef = Database.database().reference(withPath: "scores")
scoresRef.queryOrderedByValue().queryLimited(toLast: 4).observe(.childAdded) { snapshot in

}

我是否正确地假设在上面的示例中,最后4次数据写入尝试将被保存,直到再次连接-一旦连接,它们将被上载?
如果这是我想要的功能-如何实现它?如何将其与我的writeData()功能连接起来?上面例子中的“分数”指的是什么?

最佳答案

如果Firebase客户端未连接到其服务器,则该应用程序中的任何写入操作始终由Firebase客户端排队。当连接恢复时,Firebase客户端将排队的写操作发送到服务器。
当您enable disk persistence时,Firebase客户端将排队的写操作写入磁盘上的文件。Firebase客户端还将最近读取操作的任何结果写入同一文件。这样,它们也可以在任何应用程序关闭后存活,并且在用户(重新)启动应用程序并建立连接时可用/重试。
您显示的代码与排队写入的内容没有任何关系。这:

scoresRef.queryOrderedByValue().queryLimited(toLast: 4).observe(.childAdded) { snapshot in

将侦听器/观察者附加到scoresRef以获得4个最高分数。如果客户端连接到服务器,这将是最新/最高的分数。如果客户机未连接到服务器,但磁盘上有scoresRef的数据,则它将是客户机上次看到的最新/最高分数。

10-04 11:00
查看更多