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



我有一个查询是在viewWillAppear上观察到的视图控制器a

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

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

假设我从视图控制器a推送到另一个视图控制器

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

我只想要一个快照返回,如果有一些实际的变化,我的数据库。如何解决这个问题?谢谢。

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

所以如果用户在控制器上,观察者更新一个数据源(一个数组),那么UI就从那个数组更新。

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

当用户切换回A时,你将有当前数据可用所以只需从数组中重载tableView(假设这里是iOS)

这个解决方案减少了"轮询"的性质,让Firebase在需要的时候做繁重的工作来通知你的应用程序。你只是在控制器活动时从数组中重新加载tableview

编辑这里的想法是添加观察者一次-也许当视图加载第一次只有 (viewDidLoad)或可能在你的应用程序委托。一旦你添加了观察者,它会在数据变化时更新你的数据源数组,所以当你从一个视图移动到另一个视图时,唯一需要做的就是从更新后的数组中重新加载tableView。

有时候你可能想要删除观察者,但听起来你不需要从你的问题中这样做。因此,只需附加一次观察器,并让它们在数据更改时更新dataSource数组。切换视图时重新加载tableViews

  • 你已经把查询viewWillAppear,这意味着每次你来到viewController A,这个查询将被执行,不管你是否已经删除了观察者。
  • 尝试在viewDidLoad中放置相同的查询,这意味着查询将被调用一次,并且不会在任何地方移除观察者。现在,只有当firebase中的数据发生变化时,才会调用查询。

相关内容

  • 没有找到相关文章

最新更新