ios - Firebase iOS - 快照未更新但数据库已更新?

标签 ios swift firebase firebase-realtime-database

我随机遇到这个问题已经有一段时间了,我会亲自查看我的 firebase 控制台并看到我删除了一段数据,然后在代码中我将调用 print(snapshot. ref) 并查看正确的引用(复制并粘贴到浏览器中以进行双重检查),但不知何故,当我尝试获取快照的值/迭代其子项时,快照包含不再存在于数据库中的旧数据。

let key2 = ref.child(users).child("Employees").observeSingleEvent(of: FIRDataEventType.value, with: { (snapshot) in


            print(snapshot)

            for child in snapshot.children
            {

                self.nameList.append((child as AnyObject).value)
            }


     })

所以这里我的数据库看起来是这样的:(图片被截断了但是下面没有 child )

enter image description here

然而不知何故,当我打印快照时,我得到:

Snap (Employees) {
    0 = "";
    1 = "name1";
    2 = "name1";
}

这让我沮丧了一段时间,它似乎与旧快照值以某种方式存储在本地或以某种方式看不到最新版本的数据库有关。如果这很重要,我在此文件中对 .observeSingleEvent 进行了类似的调用,则上面的副本和粘贴嵌套在另一个副本中。即使这是一个同步问题,我仍然不知道如何使打印值成为旧值。

如有任何帮助,我们将不胜感激。

最佳答案

这种行为显然是设计使然。太奇怪了,我实际上就此联系了 Firebase 支持,并被告知他们会考虑修改行为或文档,但不能 promise 日期,我应该监视他们的 Release Notes更新它的 URL。

如果从SDK的角度考虑,还是有点道理的。您正在调用 observeSingleEvent。对于 Firebase,这意味着他们应该只给你打电话一次。如果具有该名称的方法产生多个回调,开发人员可能会感到困惑,对吗?

但是如果你启用了持久性,事情就会变得有点奇怪。就像 observeEventOfType 一样,Firebase 会立即为您提供磁盘上的值,以便您获得最快的 UI 更新,但随后它会调用服务器获取更新的值,以确保它具有来自然后。问题是,既然你告诉它不要用这个数据给你回电话,它会记住它(所以你将来会看到它,这就是为什么它看起来很困惑)但不会告诉你它已经到了。

通过反复试验,我发现使用 observeSingleEvent 的本能驱动可能无论如何都会被 Firebase 误导。 iOS 和 Android 都对表/ Collection View 使用“回收器” View 机制,这样即使在有大量数据的屏幕上,一次也只有少数项目实际上在内存中。除了平台的这种内置效率之外,Firebase 本身似乎工作得很好,甚至可以同时管理数十个内存中的引用。在我的应用程序中,我已经开始对我的所有用例使用 observeEventOfType 除非我有一个非常具体的,而不是与理论效率相关的原因,使用 observeSingleEvent。应用程序的性能一直很低,然后数据的工作方式更符合您的预期。

关于ios - Firebase iOS - 快照未更新但数据库已更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42430734/

相关文章:

ios - Swift xCode 6.4 - 在第二个 View Controller 中使用由 TableView Controller 生成的变量

javascript - Firebase Firestore FCM 消息发送问题

java - Android 中的 Firebase 数据库未更新

javascript - 如何通过输入元素(原始js)实时检查JavaScript对象中是否存在用户

ios - Swift iOS MetalKit 绘制一条曲线,为什么曲线的末端总是在中心,我该如何解决?

swift - 监听套接字最大连接数提早命中,同时增加了限制

iphone - 如何停止在iPhone中执行线程

ios - UITextView 未检测到链接

ios - Swift 多参数选择器没有被调用

ios - 将 image/jpeg 从 GET 请求转换为 UIImage