【问题标题】:Firebase .observeSingleEvent(of:with:) method is retrieving cached/old data [duplicate]Firebase .observeSingleEvent(of:with:) 方法正在检索缓存/旧数据[重复]
【发布时间】:2019-02-27 21:17:29
【问题描述】:

[免责声明]我亲自发布并回答了这个问题,我自己也在努力解决这个问题,并且相关地,注意到很多人仍然这样做

上下文

我正在开发一个 iOS 移动应用程序,并且 - 对于这个特定项目 - 决定使用 Firebase 实时数据库 作为我的后端基础架构。


问题

当使用.observeSingleEvent(of:with:) 方法查询特定节点的数据时,我总是发现自己检索缓存或旧数据,而不是新更新的数据。

在某些情况下,连续两次调用该方法会检索所需的服务器数据


尝试

  1. 在相关节点使用.keepSynced(true),根据Firebase documentation

    自动下载这些位置的数据并保持同步,即使引用没有活动的侦听器

【问题讨论】:

  • observeSingleEventOf 和磁盘持久性不能很好地协同工作:您的闭包立即从缓存中接收值,而客户端则从数据库中检索最新值并更新其缓存。请在此处查看我的解释,了解原因:stackoverflow.com/questions/34486417/…。解决方案是使用常规监听器:.observe(.
  • 感谢您的评论@FrankvanPuffelen。我已经多次仔细阅读您的解释,这远远超过了伟大的。尽管如此,尽管这个问题所强调的问题是相同的,但问题的根源却大不相同。
  • 在这种情况下,您能否更新您的问题以说明如何重现该问题?请参阅 how to create a minimal, complete, verifiable example 了解如何执行此操作,以及为什么这很有用。

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

概述

浏览文档,您注意到有两种主要方法可以将数据从 Firebase 实时数据库 查询到您的 iOS 移动应用程序

  1. .observe(_:with:)方法,根据Firebase Documentation,持续监听特定节点的变化,并在该节点每次数据变化时触发回调。

    此方法在附加侦听器时触发一次,并且在每次数据(包括任何子项)发生更改时再次触发。事件回调传递了一个snapshot,其中包含该位置的所有数据,包括子数据。如果没有数据,当您调用exists() 和读取value 属性时,快照将返回falsenil

  2. .observeSingleEvent(of:with:) 方法,根据Firebase Documentation,只被调用一次。

    在某些情况下,您可能希望调用一次回调然后立即删除,例如在初始化您不希望更改的 UI 元素时。您可以使用observeSingleEventOfType 方法来简化这个场景,[其中]事件回调[被触发]一次,然后不再触发。


问题

在经历了查询数据的不同可能方法之后,您已经意识到.observeSingleEvent(of:with:) 方法更适合您当前的数据库读取需求。但是,无论您修改数据库多少次,在您的应用程序中实现它都会继续检索缓存和旧数据。您在相关的数据库参考中调用了.keepSynced(true),但徒劳无功。您选择了 .observe(_:with:) 方法,一切都开始正常工作。

那么可能是什么问题?


解决方案

如果您有无效的数据库安全规则,您可能会遇到此问题的原因是完全合乎逻辑的。这些可以很容易地阻止您检索所需的数据和同步您的实时数据库。

假设您正在尝试同步 myRef 数据库引用。您需要设置正确的规则允许从此数据库参考中读取 - 类似于".read" = true"

[警告] 请注意这些数据库安全规则。不正确的规则可能会导致严重的不良行为,例如人们非法读取和/或写入您的数据库。一个关于如何设置完美安全规则的好视频是The key to firebase security - Google I/O 2016

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    相关资源
    最近更新 更多