为什么Firebase observeEventType每次都在viewWillAppear中返回一个快照?

时间:2016-11-07 21:30:56

标签: firebase firebase-realtime-database

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

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

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

所以,让我说我从View Controller A推入另一个视图控制器。

当我回到View Controller A时,观察者返回一个快照,即使我后端的数据没有改变。

如果对我的数据库进行了一些实际更改,我只想要快照返回。我该如何解决这个问题?感谢。

2 个答案:

答案 0 :(得分:1)

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

因此,如果用户在controllerA上,则观察者更新数据源(数组),然后从该数组更新UI。

当用户切换到controllerB时,观察者仍然可以更新阵列,但不要更新控制器A中的UI,因为没有必要。

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

此解决方案减少了“轮询”。大自然,让Firebase在需要时通知您的应用程序。当控制器变为活动状态时,您只是从数组重新加载tableViews。

修改

这里的想法是添加观察者一次 - 也许当视图仅加载第一次(viewDidLoad)或者可能在你的app委托中。添加观察者后,它将在数据更改时更新dataSource数组,因此当您从视图移动到视图时,所需的唯一操作是从更新的数组重新加载tableView。

有些时候你可能想要删除一个观察者,但听起来并不像你需要从你的问题那样做。所以 - 连接观察者一次,让他们在数据发生变化时更新dataSource数组。切换视图时重新加载tableView。

答案 1 :(得分:0)

  • 您已将查询放在viewWillAppear中,这意味着每次访问viewController A时,无论您是否删除了观察者,都将执行此查询。
  • 尝试在viewDidLoad中添加相同的查询,这意味着,查询将被调用一次,并且不会在任何地方删除观察者。现在只有在firebase中更改数据时才会调用查询。