ios - tables - Firebase: cuándo llamar a removeObserverWithHandle en swift
how to use firebase (2)
La documentación dice que debe llamar a observeEventType:withBlock
para eliminar un observador si ya no lo necesita.
He visto muestras donde se llama dentro de ViewDidDisAppear
. También encuentro algún código Obj-C llamado este método dentro de deinit
, que no es necesario en Swift.
En mi aplicación simple, sin embargo, quiero que los datos se sincronicen siempre que esté en la aplicación. Si este es el caso, ¿tengo que llamar a observeEventType:withBlock
alguna vez?
Comprobé el código de muestra de Chat-Swift en el sitio web de Firebase y no encontré observeEventType:withBlock
.
¿Significa que está bien no llamar a observeEventType:withBlock
:. si quiero que el observador esté encendido cuando la aplicación está en uso?
Gracias.
ACTUALIZAR
Gracias a Jay y David. Veo que tiene sentido observar en ViewWillAppear y eliminarlo en ViewDidDisappear.
Sin embargo, estoy usando observeEventType para monitorear cualquier cambio de valor en el nodo y actualizaría la IU si hubiera alguna. Si lo pongo en ViewWillAppear:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
ref.observeEventType(.Value, withBlock: { snap in {
// **update UI if there is any Value change**
})
}
El problema al ponerlo en la viewWillAppear
de viewWillAppear
es que se llama cada vez que aparece la vista, independientemente de si el valor cambia o no. Debido a esto, la instantánea se descarga y mi UI se actualiza cada vez que regreso a la vista. Esto se vuelve contraproducente.
También probé ChildAdded
/ ChildRemoved
, sin embargo, solo devuelve el último nodo, no la ruta de mi ref:
Por ejemplo, si agrego a ref / child1 / child2 / child3 / value, ChildAdded
solo devolverá child3 / value.
Entonces, si tengo que observar el valor, parece que ponerlo en ViewDidLoad
es mejor. De esta forma, obtiene la instantánea una vez cuando se carga la vista, y se repite cada vez que hay un cambio, pero no obtiene la instantánea simplemente porque aparece la vista.
observeEventType: withBlock es lo que se usa para observar un nodo.
Una vez que la aplicación esté observando un nodo, continuará observándolo a menos que salga de la aplicación o le pida a Firebase que deje de observar.
Para dejar de observar, puede usar el controlador que se devolvió cuando comenzó a observar de esta manera:
//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
o así
[ref removeAllObservers];
Para construir sobre la excelente respuesta de @ Jay:
En un UIViewController
, crea una referencia como una propiedad. Inicialice una referencia en viewDidLoad
. Observe los eventos en la vista viewWillAppear
. Eliminar observadores en 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()
}
}
Por su edición:
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 está construido para la velocidad. Este es el tipo de cosas que le deja al cliente porque tiene varias características que manejan estas situaciones.
El cliente de Firebase tiene un almacenamiento en caché incorporado. A menos que esté descargando un megabyte de datos en viewDidAppear
la actualización es nominal. Cuando el observador dispara en viewDidAppear
, no necesariamente significa que está descargando los datos nuevamente. La función viewDidAppear
es a la que pertenecen sus observadores.
FYI, soy un empleado de Firebase que trabaja en iOS.