will used tool thus tagmanager tag not manager google found developers and ios swift firebase

ios - tool - tag manager is not found and thus will not be used



Firebase eliminando observadores (3)

Tengo un problema para eliminar un observador de Firebase en mi código. Aquí hay un desglose de la estructura:

var ref = Firebase(url:"https://MY-APP.firebaseio.com/") var handle = UInt? override func viewDidLoad() { handle = ref.observeEventType(.ChildChanged, withBlock: { snapshot in //Do something with the data } } override func viewWillDisappear(animated: Bool) { if handle != nil { println("Removed the handle") ref.removeObserverWithHandle(handle!) } }

Ahora, cuando dejo Viewcontroller, veo que se imprime "Removed the handle", pero cuando regreso al viewcontroller, se llama a mi observador dos veces para cada evento. Cuando me voy y vuelvo, se llama tres veces. Etc. ¿Por qué no se quita el observador?

También llamo ref.setValue("some value") más adelante en el código, ¿podría esto tener algo que ver con eso?


Dado que es abril de 2015 y el error aún persiste, propongo una solución para el problema:

  • Mantenga una referencia de los identificadores (digamos en un diccionario y antes de iniciar un nuevo observador para el mismo tipo de evento, compruebe si el observador ya está allí.

Tener las asas alrededor tiene una huella muy baja (en base a algunos comentarios oficiales :)) por lo que no dolerá tanto.


Pensé que estaba teniendo este error, pero en realidad estaba tratando de eliminar a los observadores en la referencia incorrecta.

CÓDIGO ORIGINAL:

let ref: FIRDatabaseReference = FIRDatabase.database().reference() var childAddedHandles: [String:FIRDatabaseHandle] = [:] func observeFeedbackForUser(userId: String) { if childAddedHandles[userId] == nil { // Check if observer already exists // NOTE: - Error is caused because I add .child(userId) to my reference and // do not when I call to remove the observer. childAddedHandles[userId] = ref.child(userId).observeEventType(.ChildAdded) { [weak self] (snapshot: FIRDataSnapshot) in if let post = snapshot.value as? [String:AnyObject], let likes = post["likes"] as? Int where likes > 0 { self?.receivedFeedback(snapshot.key, forUserId: userId) } } } } func stopObservingUser(userId: String) { // THIS DOES NOT WORK guard let cah = childAddedHandles.removeValueForKey(userId) else { print("Not observing user") return } // Error! I did not add .child(userId) to my reference ref.removeObserverWithHandle(cah) }

CÓDIGO FIJO:

func stopObservingUser(userId: String) { // THIS WORKS guard let cah = childAddedHandles.removeValueForKey(userId) else { print("Not observing user") return } // Add .child(userId) here ref.child(userId).removeObserverWithHandle(cah) }


Los observadores deben eliminarse en la misma ruta de referencia en la que fueron colocados. Y para la misma cantidad de veces que se emitieron, o use ref.removeAllObservers () para cada ruta.

Aquí hay un truco que uso para mantenerlo ordenado:

var fbObserverRefs = [FIRDatabaseReference]() // keep track of where observers defined.

... luego, ponga los observadores en viewDidLoad ():

fbObserverRefs.append(ref.child("user//(uid)")) fbObserverRefs.last!.observe(.value, with: { snap in // do the work... })

... luego, en viewWillDisappear (), tenga cuidado de eliminar cualquier observador emitido:

// Only true when popped from the Nav Controller stack, ignoring pushes of // controllers on top. if isBeingDismissed || isMovingFromParentViewController { fbObserverRefs.forEach({ $0.removeAllObservers() }) }