ios - Firebase:何时快速调用 removeObserverWithHandle

标签 ios swift uikit firebase observers

文档说您需要调用 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/

相关文章:

ios - 使用 SwiftUI 时如何隐藏键盘?

ios - 容器 View Controller 无法处理 Unwind Segue 操作

arrays - 如何使用 swift 将新数据传输到数组?

iphone - UITableView:在错误更新后从 NSInternalInconsistencyException 中恢复?

ios - swift 5 : index out of range when returning the array count from tableView numberOfRowsInSection

ios - UITableView 显示不正确 - 为什么?

来自 UIImage/CGImage 的 iOS 图层蒙版?

swift - 如何仅在 12 :00 PM in Swift 之前获取时间

iOS MapView无法配合GPS服务

ios - 向上滚动 tableView 的无限滚动?