Dokumentation besagt, dass Sie observeEventType:withBlock
aufrufen müssen, um einen Beobachter zu entfernen, wenn Sie ihn nicht mehr benötigen.Firebase: Wenn removeObserverWithHandle in swift aufgerufen werden soll
Ich habe Proben gesehen, wo es innerhalb ViewDidDisAppear
aufgerufen wird. Ich finde auch einen Obj-C-Code, der diese Methode innerhalb von deinit
genannt wird, was in Swift nicht notwendig ist.
In meiner einfachen App möchte ich jedoch Daten synchronisiert werden, solange ich in der App bin. Wenn dies der Fall ist, muss ich observeEventType:withBlock
jemals anrufen?
Ich habe den Chat-Swift-Beispielcode auf der Firebase-Website überprüft und observeEventType:withBlock
nicht gefunden.
Bedeutet es, es ist in Ordnung, nicht zu rufen observeEventType:withBlock
:. Wenn ich möchte, dass der Beobachter eingeschaltet ist, wenn die App verwendet wird?
Vielen Dank.
UPDATE
Dank Jay und David. Ich sehe es sinnvoll in ViewWillAppear zu beobachten und in ViewDidDisappear zu entfernen.
Ich verwende jedoch observeEventType, um jede Wertänderung für den Knoten zu überwachen, und würde die Benutzeroberfläche aktualisieren, wenn eine vorhanden ist. Wenn ich es in ViewWillAppear setzen:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
ref.observeEventType(.Value, withBlock: { snap in {
// **update UI if there is any Value change**
})
}
Das Problem mit ihm in viewWillAppear
setzen ist, dass es jedes Mal aufgerufen wird, die Ansicht, unabhängig von Wertänderung erscheint oder nicht. Aus diesem Grund wird der Snapshot heruntergeladen und meine Benutzeroberfläche wird jedes Mal aktualisiert, wenn ich zur Ansicht zurückkehre. Dies wird kontraproduktiv.
Ich habe auch versucht ChildAdded
/ChildRemoved
, es jedoch nur den letzten Knoten zurückkehrt, nicht der Weg von meinem ref:
Zum Beispiel, wenn ich hinzufügen/child1/child2/child3/Wert auf ref ChildAdded
würde nur child3/value zurückgeben.
Also, wenn ich Wert zu beachten habe, scheint es, als ob es in ViewDidLoad
ist besser? Auf diese Weise erhält es den Snapshot einmal, wenn die Ansicht geladen wird, und würde sich bei jeder Änderung wiederholen, würde aber den Snapshot nicht erhalten, nur weil die Ansicht angezeigt wird.
@David antwortet dies, da es aufhört zu beobachten, wenn die Ansicht nicht angezeigt wird. Es aktualisiert die Ansicht, wenn es angezeigt wird, aber das mag sein, was Sie sowieso wollen. Es gibt zwei andere mögliche Lösungen: 1) ref.observeEventType gibt tatsächlich ein Handle zurück. Speichern Sie dieses Handle als Eigenschaft. Wenn es null ist, handle = ref.observeEventType. Wenn es nicht Null ist, dann tu es nicht. 2) Bewege den observeEventType auf eine höhere Ebene. Angenommen, Sie initialisieren Ansichten aus dem App-Delegaten, nachdem sie eingerichtet wurden, und beobachten Sie dann Ereignistyp. – Jay
Das ChildAdded-Ereignis sollte untersucht werden. Wenn Sie es versucht haben und es nur den letzten Knoten zurückgibt, dann gibt es einen Codierungsfehler. Es wird einmal ausgelöst, wenn Sie es nacheinander für jeden untergeordneten Knoten und dann nur für childAdded-Ereignisse aufrufen. Sie können diese Funktion verwenden, um die Benutzeroberfläche zunächst aufzufüllen (sie wird einmal für jedes Kind aufgerufen) und anschließend die Benutzeroberfläche aktualisieren (wird nur aufgerufen, wenn ein untergeordnetes Element hinzugefügt wird und nur das neue untergeordnete Element angezeigt wird). Wir verwenden selten Value-Ereignisse, da wir nach dem Laden von Daten nur über Änderungen informiert werden möchten. Das Implementieren von ChildAdded, ChildChanged und ChildRemoved behandelt das. – Jay
Danke Jay. Nach ein paar Versuchen entschied ich mich, meinen Beobachter in viewDidLoad zu belassen, wechselte aber von der Beobachtung von Value zur Beobachtung von ChildAdded/Removed abhängig von meiner Verwendung. Danke für deinen Beitrag. – User5103156