Firebase:何时在swift中调用removeObserverWithHandle

文档说你需要调用observeEventType:withBlock去除观察者,如果你不再需要它。

我在ViewDidDisAppear看过样本。 我也发现一些Obj-C代码在deinit调用了这个方法,这在Swift中是不需要的。

然而,在我的简单应用程序中,只要我在应用程序中,我想要同步数据。 如果是这种情况,我是否必须调用observeEventType:withBlock

我检查了Firebase网站上的Chat-Swift示例代码,但未findobserveEventType:withBlock

这是否意味着不要调用observeEventType:withBlock 如果我希望观察者在应用程序正在使用时开启?

谢谢。

UPDATE

感谢Jay和David。 我发现在ViewWillAppear中观察并在ViewDidDisappear中删除它是有意义的。

但是,我正在使用observeEventType来监视节点的任何值更改,并会更新UI(如果有)。 如果我把它放在ViewWillAppear中:

  override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) ref.observeEventType(.Value, withBlock: { snap in { // **update UI if there is any Value change** }) } 

把它放在viewWillAppear的问题是,每次出现视图时都会调用它,而不pipe值是否改变。 因此,下载快照,每当我返回到视图时,我的用户界面都会刷新。 这变得适得其反。

我也尝试了ChildAdded / ChildRemoved ,但是,它只返回最后一个节点,而不是从我的ref的path:

例如,如果我添加到ref / child1 / ChildAdded / child3 /值, ChildAdded只会返回child3 /值。

所以,如果我必须遵守价值观,好像把它放在ViewDidLoad更好? 通过这种方式,当视图加载时,它会获得一次快照,并且只要有变化就会重复,但不会因为视图出现而获得快照。

以@Jay的优秀答案为基础:

UIViewController ,创build一个引用作为一个属性。 在viewDidLoad初始化一个引用。 在viewWillAppear观察事件。 在viewDidDisappear删除观察者。

 class MyViewController: UIViewController { var ref: Firebase! // Called only on load, great place to initialize override func viewDidLoad() { super.viewDidLoad() ref = Firebase(url: "https://<YOUR-FIREBASE-APP>.firebaseio.com/updates") } // Can be called many times to go on screen // Syncing should only occur when on view to conserve memory override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) ref.observeEventType(.Value, withBlock: { snap in { // do something with the data }) } // Can be called many times to off screen // Remove observers on the ref to conserve memory override func viewDidDisappear(animated: Bool) { super.viewDidDisappear(animated) ref.removeAllObservers() } } 

根据您的编辑:

 The problem with putting it in viewWillAppear is that, it gets called every time the view appears, regardless of Value change or not. Because of this, the snapshot is downloaded and my UI gets refreshed every time I return to the view. This becomes counterproductive. 

Firebase是为速度而build造的。 这些都是你留给客户的东西,因为它有几个function来处理这些情况。

Firebase客户端具有内置caching。 除非您在viewDidAppear下载兆字节的数据,否则更新是名义上的。 当观察者在viewDidAppear触发时,不一定意味着它再次下载数据。 viewDidAppear函数是你的观察者所属的地方。

仅供参考,我是一名在iOS上工作的Firebase员工。

observeEventType:withBlock是用来观察节点的。

一旦应用程序观察节点,它将继续观察,除非您退出应用程序或告诉Firebase停止观察。

要停止观察,可以使用在开始观察时返回的句柄:

  //start observing and get a handle FirebaseHandle handle = [ref observeEventType:FEventTypeValue withBlock:^(FDatasnapshot* snapshot) { // do some stuff with the snapshot data }]; [ref removeObserverWithHandle:handle]; //stop observing using the handle 

或者像这样

 [ref removeAllObservers];