【问题标题】:Implementation and function of Querying Data Offline - Realtime Database离线查询数据的实现和功能-实时数据库
【发布时间】:2019-05-20 21:03:46
【问题描述】:

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

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

它工作正常,但我目前正在尝试减少数据丢失导致应用程序死亡的可能性。这样做我最近浏览了网络,发现了一个叫做:“Querying Data Offline”的东西,代码如下:

let scoresRef = Database.database().reference(withPath: "scores")
scoresRef.queryOrderedByValue().queryLimited(toLast: 4).observe(.childAdded) { snapshot in

}

我是否正确假设在上面的示例中,最后 4 次数据写入尝试正在保存,直到再次连接 - 一旦有连接,它们就会被上传?

如果这是我想要的功能 - 如何实现它?如何将它与我的writeData() 功能连接起来?上例中的“分数”指的是什么?

【问题讨论】:

    标签: ios swift firebase


    【解决方案1】:

    如果 Firebase 客户端未连接到其服务器,则来自该应用的任何写入操作始终由 Firebase 客户端排队。连接恢复后,Firebase 客户端会将排队的写入发送到服务器。

    当您enable disk persistence 时,Firebase 客户端会将排队的写入操作写入磁盘上的文件。 Firebase 客户端还将最近读取操作的任何结果写入同一文件。这样,它们也将在任何应用关闭后仍然存在,并且在用户(重新)启动应用并建立连接时可用/重试。

    您展示的代码与排队的写入无关。这个:

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

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

    【讨论】:

    • 谢谢!所以我只需要添加:Database.database().isPersistenceEnabled = truedidFinishLaunchingWithOptions 即可启用此行为?
    • 如果 这种行为 你的意思是“将排队的写入和最近的风险存储到磁盘,以便它在应用程序重新启动后仍然存在”,那么“是的,这确实是由该行启用的您共享的代码”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 2011-03-02
    相关资源
    最近更新 更多