Ios Firebase.observeSingleEvent(of:with:)方法正在检索缓存/旧数据

Ios Firebase.observeSingleEvent(of:with:)方法正在检索缓存/旧数据,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,[免责声明]在我自己努力解决这个问题之后,我亲自发布并回答了这个问题,并且注意到许多人仍然这样做 上下文 我正在开发一个iOS移动应用程序,并决定使用Firebase实时数据库作为我的后端基础设施 问题 当使用.observeSingleEvent(of:with:)方法查询特定节点上的数据时,我总是发现自己正在检索缓存或旧数据,而不是新更新的数据 在某些情况下,在一行中调用该方法两次将检索所需的服务器数据 尝试 在相关节点上使用.keepSynced(true),根据 在这些位置自动下载数

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

上下文 我正在开发一个iOS移动应用程序,并决定使用Firebase实时数据库作为我的后端基础设施


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

在某些情况下,在一行中调用该方法两次将检索所需的服务器数据


尝试
  • 在相关节点上使用
    .keepSynced(true)
    ,根据 在这些位置自动下载数据并保持同步,即使引用没有活动的侦听器

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

  • .observe(:with:)
    方法,根据,该方法连续侦听特定节点上的更改,并在特定节点上每次更改数据时触发回调。 此方法在附加侦听器时触发一次,在每次数据(包括任何子项)更改时触发一次。事件回调传递一个包含该位置的所有数据(包括子数据)的
    快照。如果没有数据,则在调用
    exists()
    时,快照将返回
    false
    ,在读取其
    属性时,快照将返回
    nil

  • .observeSingleEvent(of:with:)
    方法,根据,该方法只调用一次。 在某些情况下,您可能希望回调调用一次,然后立即删除,例如在初始化您不希望更改的UI元素时。您可以使用
    observeSingleEventOfType
    方法简化此场景,[在该场景中]事件回调[被触发]一次,然后不再触发


  • 问题 在研究了查询数据的各种可能方法之后,您意识到
    .observeSingleEvent(of:with:)
    方法更适合您当前的数据库读取需要。然而,无论您修改数据库多少次,在应用程序中实现它都会继续检索缓存和旧数据。您在相关数据库引用处调用了
    .keepSynced(true)
    ,但没有成功。您选择了
    .observe(:with:)
    方法,一切都开始正常工作

    那么问题是什么呢


    解决方案 如果您有无效的数据库安全规则,那么出现此问题的原因完全符合逻辑。这很容易阻止您检索所需数据和同步实时数据库

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


    [警告]请小心使用这些数据库安全规则。不正确的规则可能会导致严重的不受欢迎的行为,例如有人非法读取和/或写入您的数据库。关于如何设置完美的安全规则的一个好视频是

    observeSingleEventOf
    和磁盘持久性不能很好地协同工作:您的立即关闭ely从缓存中接收值,而客户端则从数据库中检索最新的值,并更新其缓存。有关原因,请参阅此处的说明:。解决方案是使用常规侦听器:
    。注意(
    。感谢您在@FrankvanPuffelen发表的评论。我已经仔细阅读了您的解释多次,这远远不够好。尽管如此,尽管此问题强调的问题是相同的,但问题的来源却非常不同。在这种情况下,您能否更新您的问题以说明如何重现此问题?请参阅了解如何重现此问题要做到这一点,以及为什么这是有用的。