Firebase: когда вызывать removeObserverWithHandle в swift

Документация говорит, что вам нужно позвонить observeEventType:withBlock, чтобы удалить наблюдателя, если он вам больше не нужен.

Я видел образцы, где он вызывается внутри ViewDidDisAppear. Я также нашел некоторый код Obj-C, называемый этим методом, в deinit, который не является обязательным в Swift.

В моем простом приложении, однако, я хочу, чтобы данные синхронизировались до тех пор, пока я нахожусь в приложении. Если это так, нужно ли мне когда-либо звонить observeEventType:withBlock?

Я проверил код примера Chat-Swift на сайте Firebase и не нашел observeEventType:withBlock.

Означает ли это, что нормально не звонить observeEventType:withBlock:. если я хочу, чтобы наблюдатель был включен, когда приложение используется?

Спасибо.

UPDATE

Спасибо Джей и Дэвиду. Я вижу, что имеет смысл наблюдать в ViewWillAppear и удалять его в ViewDidDisappear.

Тем не менее, я использую функцию observEventType для мониторинга любого изменения значения в node и будет обновлять интерфейс, если он есть. Если я поставлю его в ViewWillAppear:

 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    ref.observeEventType(.Value, withBlock: { snap in {
      // **update UI if there is any Value change** 
    })
  }

Проблема с помещением в viewWillAppear заключается в том, что она вызывается каждый раз, когда появляется представление, независимо от изменения значения или нет. Из-за этого снимок загружается, и мой пользовательский интерфейс обновляется каждый раз, когда я возвращаюсь к представлению. Это становится контрпродуктивным.

Я также пробовал ChildAdded/ChildRemoved, однако он возвращает только последний node, а не путь из моего ref:

Например, если я добавлю значение ref/child1/child2/child3/значение, ChildAdded вернет значение child3/value.

Итак, если мне нужно наблюдать Value, кажется, лучше положить его в ViewDidLoad? Таким образом, он получает моментальный снимок один раз при загрузке представления и повторяется всякий раз, когда есть изменение, но не получает моментальный снимок только потому, что отображается представление.

Ответ 1

Чтобы построить на @Jay отличный ответ:

В a 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, обновление является номинальным. Когда наблюдатель загорается на viewDidAppear, это не обязательно означает, что он снова загружает данные. Функция viewDidAppear принадлежит вашим наблюдателям.

FYI, я сотрудник Firebase, который работает на iOS.

Ответ 2

observEventType: withBlock - это то, что используется для наблюдения node.

Как только приложение будет наблюдать за node, оно будет продолжать наблюдаться, если вы не покинете приложение или не сообщите 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];