文档说您需要调用 observeEventType:withBlock
来删除不再需要的观察者。
我见过在 ViewDidDisAppear
中调用它的示例。我还在 deinit
中找到了一些调用此方法的 Obj-C 代码,这在 Swift 中不是必需的。
但是,在我的简单应用程序中,只要我在应用程序中,我就希望同步数据。如果是这种情况,我是否必须调用 observeEventType:withBlock
?
我查看了 Firebase 网站上的 Chat-Swift 示例代码,没有找到 observeEventType:withBlock
。
这是否意味着可以不调用 observeEventType:withBlock
:.如果我希望观察者在使用应用程序时打开?
谢谢。
更新
感谢 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
中的问题在于,无论 Value 是否更改,每次 View 出现时都会调用它。因此,每次返回 View 时都会下载快照并刷新我的 UI。这会适得其反。
我也试过 ChildAdded
/ChildRemoved
,但是,它只返回最后一个节点,而不是我的 ref 的路径:
例如,如果我添加到 ref/child1/child2/child3/value,ChildAdded
将只返回 child3/value。
所以如果我必须观察 Value,似乎将它放在 ViewDidLoad
中会更好?这样,它在加载 View 时获取一次快照,并在每次有变化时重复获取快照,但不会因为 View 出现而获取快照。
最佳答案
以@Jay 的出色回答为基础:
在 UIViewController
中,创建一个引用作为属性。在 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 专为速度而生。这些是您留给客户端处理的事情,因为它有几个功能可以处理这些情况。
Firebase 客户端具有内置缓存。除非您在 viewDidAppear
中下载 1 兆字节的数据,否则更新是名义上的。当观察者在 viewDidAppear
上触发时,并不一定意味着它正在再次下载数据。 viewDidAppear
函数是您的观察者所在的位置。
仅供引用,我是一名在 iOS 上工作的 Firebase 员工。
关于ios - Firebase:何时快速调用 removeObserverWithHandle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31478657/