[免责声明]我本人在与自己进行斗争后亲自张贴并回答了这个问题,并注意到许多人仍然这样做
我正在开发iOS移动应用程序,并且-对于这个特定项目-决定使用 Firebase实时数据库作为我的后端基础结构。
使用.observeSingleEvent(of:with:)
方法在特定节点上查询数据时,我总是发现自己正在检索缓存的或旧的数据,而不是新近更新的数据。
在某些情况下,连续两次调用该方法会检索所需的服务器数据。
.keepSynced(true)
自动在这些位置下载数据并保持同步,即使引用没有活动的侦听器也是如此
答案 0 :(得分:0)
在阅读文档时,您会注意到有两种主要方法可将数据从 Firebase实时数据库查询到iOS移动应用程序中
.observe(_:with:)
方法连续侦听特定节点上的更改,并在每次该节点上的数据更改时触发回调。
当附加了侦听器时,将触发此方法,并且每次数据(包括任何子级)发生更改时,都会再次触发此方法。事件回调传递给
snapshot
,其中包含该位置的所有数据,包括子数据。如果没有数据,则在调用false
时快照将返回exists()
,而在读取快照的nil
属性时将返回value
。
.observeSingleEvent(of:with:)
方法。
在某些情况下,您可能希望调用一次回调,然后立即将其删除,例如在初始化您不希望更改的UI元素时。您可以使用
observeSingleEventOfType
方法来简化这种情况,[在此情况下,事件回调[被触发]一次,然后不再触发。
在研究了各种可能的查询数据方法之后,您已经意识到.observeSingleEvent(of:with:)
方法更适合您当前的数据库读取需求。但是,无论您修改数据库多少次,在应用程序中实现它都会继续检索缓存的数据和旧数据。您已在相关的数据库参考中致电.keepSynced(true)
,但徒劳无功。您选择了.observe(_:with:)
方法,一切开始正常运行。
那可能是什么问题?
如果您具有无效的数据库安全规则,则可能会遇到此问题的原因是完全合乎逻辑的。 。这些可以轻松地阻止您检索所需的数据并同步实时数据库。
让我们假设您正在尝试同步myRef
数据库引用。您需要设置正确的规则允许从该数据库引用中读取-类似于".read" = true"
。
[警告]请注意这些数据库安全规则。错误的规则可能导致严重的不良行为,例如人们非法从数据库中读取和/或写入数据库。 The key to firebase security - Google I/O 2016
是一个很好的视频,介绍了如何设置完美的安全规则。