2016-04-11 5 views
11

mam globalnego obserwatora ViewController i potrzebują kilka różnych obserwatorów wewnątrz niego konkretnych wartościach, takich jak ten poniżej. Czy można raz usunąć obserwatora po zmianie wartości?Usuń obserwator po zmianie wartości w Firebase

var ref = Firebase(url: "https://<FIREBASE-APP>.firebaseio.com/") 

let handle = ref.observeEventType(.Value, withBlock: { snapshot in 

    //Here VALUE Changes to NEW_VALUE 
    if snapshot.value as! String == NEW_VALUE { 

     //IS IT POSSIBLE TO REMOVE HANDLE HERE???? 
     ...something here 
    } 

}) 

//NOT HERE 
...ref.removeObserverWithHandle(handle) 
+0

ref.observeSingleEventOfType? – mrkbxt

+0

observeSingleEventOfType po prostu obserwuje raz, tak jak pojedyncze zapytanie, a następnie usuwa się sam. Muszę zawsze obserwować wartość, dopóki się nie zmieni, a potem ją usunąć. –

+0

Czy możesz wyjaśnić; różni obserwatorzy dla określonych wartości? W pytaniu obserwujesz przez .value, cały twój węzeł aplikacji, który uruchomi dowolną edycję dodaną lub usunie zdarzenie w dowolnym miejscu w tym węźle. Jeśli nastąpi zmiana, migawka zwróci * wszystko * (wszystkie węzły potomne, ich dzieci itd.) Wewnątrz tego węzła, którego nie można porównać z łańcuchem. nawet jeśli może jednak, jeśli usuniesz uchwyt, węzeł aplikacji nie będzie już obserwowany w przypadku jakichkolwiek zmian. Czy możesz uściślić swoje pytanie? – Jay

Odpowiedz

24

Jest to jeden z przypadków, gdzie trzeba wziąć dodatkowy krok w Swift, ponieważ nie zdaje sobie sprawy, że można bezpiecznie przejść handle wewnątrz bloku.

Jednym ze sposobów pracy wokół to jest:

let ref = Firebase(url: "https://yours.firebaseio.com/") 
var handle: UInt = 0 
handle = ref.observeEventType(.Value, withBlock: { snapshot in 
    print(snapshot) 
    if snapshot.exists() && snapshot.value as! String == "42" { 
     print("The value is now 42") 
     ref.removeObserverWithHandle(handle) 
    } 
}) 

jawnie inicjowanie zmiennej handle usuwamy błąd z Swift kompilator. Ale biorąc pod uwagę, że uchwyt zostanie ustawiony przed wywołaniem naszego bloku, możemy bezpiecznie wywołać ref.removeObserverWithHandle(handle) wewnątrz bloku.

+0

to jest dokładnie to, czego potrzebuję, dziękuję Franka !!!! –

+1

.value będzie powodować problem, ponieważ będzie ona powrócić wszystkie wartości z węzłem , która byłaby strukturą słownikową, która nie może być porównywana z ciągiem znaków, prawdopodobnie dla dziecka w snapshot.children to zrobiłaby, a także nie potrzeba w ogóle żadnego uchwytu, jeśli chcemy obserwować jedną zmianę, po prostu dopełniaj. removeAllObservers wewnątrz bloku. :-) – Jay

+0

Dobry punkt na strukturze @ Jay. Ale nie zgadzam się z wywołaniem 'ref.removeAllObservers()'. To (jak sama nazwa wskazuje) usuwa * wszystkich * obserwatorów, co nie jest takie samo. Chociaż może działać dla tego prostego fragmentu, generalnie wolę mieć symetrię pomiędzy dodawaniem słuchaczy i usuwaniem ich, Hmm, –