Firebase 如何处理离线时执行的事件?

Posted

技术标签:

【中文标题】Firebase 如何处理离线时执行的事件?【英文标题】:How does Firebase deals with events performed while offline? 【发布时间】:2013-11-14 11:00:34 【问题描述】:

来自 Firebase 的常见问题解答:

如果我失去网络连接,我的应用会怎样?

Firebase 透明地重新连接到 Firebase 服务器 您重新连接。与此同时,所有 Firebase 操作都已完成 您的应用程序在本地将立即触发事件(...)。一次 重新建立连接后,您将收到适当的一组 事件,以便您的客户端“赶上”当前服务器状态

如果我离线并不断修改我的本地数据,然后重新在线并且其他客户端执行了不同的更改,会发生什么?哪一个最终会得救?

如果服务器上的数据被覆盖,是否意味着旧数据可以替换新数据?

如果保留在线添加的较新数据,我是否知道离线提交的数据已被丢弃?

【问题讨论】:

如果您担心并发访问,您应该将更改放在事务中。 firebase.com/docs/transactions.html 我并不担心并发访问,而是担心旧数据替换新数据或默默丢弃更新。 【参考方案1】:

当您的客户端在离线一段时间后重新上线并写入数据时,这些更改的行为将取决于您使用哪种方法写入它们:

set()setWithPriority()remove()push() 方法是最后写入获胜的方法。这意味着如果离线客户端 A 在 t=0 进行更改,而在线客户端 B 在 t=10 进行更改,则离线客户端 A 的更改将在重新连接时覆盖客户端 B 的更改。请注意,这特别适用于所做的更改(即将 /a/b/c 设置为 1),而不是整个 Firebase。 但是,transaction() 方法是专门为处理冲突而构建的。当离线客户端 A 重新连接时,您的事务更新功能将重新运行并将新更改应用到您的 Firebase 数据。

在大多数应用程序中,用户将数据附加到列表或修改单个用户状态,而不是修改同一条数据。如果多个用户正在修改同一条数据,无论您是否离线,都需要使用transaction()

一般而言,Firebase 已构建为自动处理离线和在线,因此您不必编写应用程序代码来检测和处理这种情况。

【讨论】:

感谢您的解释,但我是否正确假设您的答案中的 transaction 部分不再正确?离线时,尝试运行事务会返回“由于网络断开而必须中止操作” DatabaseError,并且一旦在线,事务就不会重新运行 @Rob DiMarco 这是否仍然适用于当前版本 9?启用持久性怎么样?事务不会在应用程序重新启动时保持不变。我们还应该使用启用持久性的事务吗?

以上是关于Firebase 如何处理离线时执行的事件?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase - 互联网离线时上传图片

应用离线时如何绕过 Firebase 身份验证?

当用户离线时,Firebase 身份验证会话会持续多长时间?

Firebase 离线支持:在用户离线时上传帖子,当用户在 iOS Swift 应用程序中在线时同步

如何在用户离线时尝试将数据添加/上传到 Firebase 时显示错误?

离线设备上的 Firebase 云功能