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

来自 Firebase 的常见问题解答:

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

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

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

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

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

【问题讨论】:

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

标签: firebase consistency


【解决方案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?启用持久性怎么样?事务不会在应用程序重新启动时保持不变。我们还应该使用启用持久性的事务吗?
猜你喜欢
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
  • 2016-02-14
  • 1970-01-01
相关资源
最近更新 更多