【问题标题】:Flutter Firestore make runTransaction instantaneous on deviceFlutter Firestore 使 runTransaction 在设备上瞬间完成
【发布时间】:2018-11-15 08:42:42
【问题描述】:

自从开始使用DatabaseReference.runTransaction函数后,就遇到了问题。

看了最新的Google Developers Flutter promotion video,我现在有信心准确的呈现这个问题了!

使用 DatabaseReference.updateData 会立即将信息传递给Stream<QuerySnapshot>。这个可以be seen here。在他点击项目的那一刻,即updateData 更新,计数器也立即更新,这是非常好的预期行为这意味着您执行更新的设备会立即更新,但另一台设备从服务器获取延迟。

当您转换到 runTransaction 时,此功能完全丢失,您将不得不等待设备上未处理但从 Firestore 发送的定期更新。 Looking at the new implementation,您可以清楚地看到两个设备同时同时更新存在延迟,并且比这更糟糕。由此可以清楚地得出,没有on device数据更新,这对于UI来说是非常烦人的。

不搜索解决方法,因为我显然已经实现了自己,这意味着我自己管理我的更新,在这种情况下,我会在我点击的那一刻在内部更新计数器在更新程序上。

我想知道的是是否有办法启用 即时 行为 runTransaction

【问题讨论】:

    标签: dart google-cloud-firestore flutter


    【解决方案1】:

    我怀疑这是可能的,否则它不会是交易。 事务必须是ACID,因此需要在中心点(服务器)进行协调。

    这就是为什么事务没有本地更新然后同步到服务器的原因。

    【讨论】:

    • 在我的记忆中,我可以清楚地看到我在 Android 上有这种行为,但我可能错了。即使不是,我也不能完全理解对响应式 UI 的反对意见,即使它只是处理事务,就像它在数据库的脱机副本上执行一样。你认为在这种情况下提出问题会导致什么结果吗?
    • 如果可以在原生Android中复现,那绝对值得一试。 “反对拥有响应式 UI”这不是不想要这个,而是关于这在技术上是否可以解决,而不会因数百万未完成的事务而使服务器陷入困境。
    • 我试图将其显示为一种权衡,即本质上是基于立即发送到Stream 的本地数据以及随后来自稍后服务器。这意味着 GitHub 上的问题一文不值,因为我显然没有抓住重点,应该自己处理?
    • 事务是关于硬保证的,没有太多的权衡空间。它们对于服务器来说也非常昂贵,而 Firebase 是关于可扩展性的,其中事务已经是一种权衡。
    • 我对 Android 部分的理解是错误的,因为我在研究后发现。我从不怀疑从事该项目的任何人的能力。我只是想知道该项目相对较新。我了解 ACID 部分,并且我觉得不值得打扰其他人制作适用于所有场景的东西,我将继续自己实现它。我只是在考虑一个可选参数。
    【解决方案2】:

    交易不能是即时的。它们总是需要与服务器进行往返,以确保真正正确和原子更新。

    【讨论】:

    • 感谢您的回答,显然他们不能。我什至没有想到这一点。我想知道是否有一种方法可以将更新推送到Stream,它在本地处理的方式与视频中展示的updateData 完全相同。我知道这个更新可能有问题,我自己也是这样做的,直到服务器推送新值。
    猜你喜欢
    • 2019-08-07
    • 2020-07-02
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 2023-03-27
    • 2020-06-18
    相关资源
    最近更新 更多