【问题标题】:Why does Firebase observeEventType return a snapshot everytime in viewWillAppear?为什么 Firebase observeEventType 每次在 viewWillAppear 中都返回一个快照?
【发布时间】:2016-11-09 05:55:41
【问题描述】:

我在 View Controller A 上的 viewWillAppear 上观察到了一个查询

let query = FIRDatabase.database().reference().child("tags").
    queryOrdered(byChild: "users/uid").queryEqual(toValue: userId)

在同一个视图控制器中,在viewDidDisappear 中,我删除了这个观察者。

假设我从视图控制器 A 推入另一个视图控制器。

当我回到视图控制器 A 时,观察者会返回一个快照,即使我在后端的数据没有改变。

我只希望在我的数据库发生实际更改时返回快照。我该如何解决这个问题?谢谢。

【问题讨论】:

  • 所以您是说在控制器A 中执行您问题中的代码。然后当用户从控制器 A 移动到控制器 B 时,观察者被移除。那么当回到controllerA时,上面的代码会再次执行吗?每当您附加观察者时,都会返回一个快照,因为“新”观察者不知道数据 - 它被删除,然后添加了一个“新”观察者,因此数据是新的。可能没有理由将其删除。如果从 A 移动到 B 时数组保持活动状态,只需让观察者更新它,这样当您回到 A 时,数据就是最新的。
  • 是的,您正确理解了我的情况。但这是我看到的问题: 1. 我进行不必要的网络调用只是为了“了解”我的快照是否已更改,我认为这很昂贵? 2. 我的显示这个快照的tableview现在每次都被重新加载,这并不理想。对这两点有什么想法吗?感谢您的回复。编辑:我在 viewDidDisappear 中删除观察者的原因是因为这篇文章告诉我这样做:firebase.googleblog.com/2015/10/…

标签: firebase firebase-realtime-database


【解决方案1】:

一个答案是让观察者完成它的工作并在后台更新您的数据。

因此,如果用户在控制器 A 上,则观察者会更新数据源(数组),因此 UI 会从该数组更新。

当用户切换到controllerB时,观察者仍然可以更新数组,但是不需要更新controllerA中的UI。

当用户切换回 A 时,您将获得当前数据,因此只需从数组中重新加载 tableView(假设是 iOS)。

此解决方案减少了“轮询”性质,让 Firebase 完成繁重的工作,以便在需要时通知您的应用。当控制器变为活动状态时,您只是从数组中重新加载 tableViews。

编辑

这里的想法是添加一次观察者 - 可能是当视图加载 第一次 (viewDidLoad) 或可能在您的应用程序委托中。添加观察者后,它会在数据更改时更新您的 dataSource 数组,因此当您从一个视图移动到另一个视图时,唯一需要的操作就是从更新的数组重新加载 tableView。

有时您可能想要移除观察者,但听起来您不需要从您的问题中移除。所以 - 附加观察者一次,让他们随着数据的变化更新 dataSource 数组。切换视图时重新加载 tableViews。

【讨论】:

  • 每次 controllerA调用viewWillAppear对Firebase进行网络调用是否存在潜在的性能问题?如果您的快照可能包含数百个单元格数据,这似乎非常低效。
  • @Woodless 我的解决方案完全避免了这种情况,因为您只添加了一次观察者。所以说在你的应用程序委托中添加观察者,Firebase 会在后台悄悄地更新你的数组,所以当你在 UI 中切换视图时,你只需要重新加载 tableView 以显示来自数组的当前数据。即不要在每次 viewDidAppear 时添加观察者 - 只添加一次。我会在我的回答中更清楚地说明这一点。
【解决方案2】:
  • 您已将查询放在 viewWillAppear 中,这意味着每次您来到 viewController A 时,无论您是否移除了观察者,都会执行此查询。
  • 尝试将相同的查询放在 viewDidLoad 中,这意味着该查询将被调用一次,并且不会在任何地方删除观察者。现在,只有在 firebase 中的数据发生更改时才会调用查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多