2016-04-11 6 views
11

私はViewControllerにグローバルオブザーバを持っており、その中にいくつかのオブザーバが必要です。一度値を変更してオブザーバを取り除くことは可能ですか?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は、単一のrest-queryと同じように1回だけ観測し、それ自体を削除します。私はそれが変化し、それを取り除くまで、常に価値を観察する必要があります。 –

+0

あなたは明確にすることができますか?特定の値について異なるオブザーバー?問題では、.valueによって、そのノード内の任意の追加編集やイベントを削除するアプリケーションノード全体を監視しています。変更があった場合、スナップショットはそのノード内の*すべて*(すべての子ノード、子ノードなど)を返します。これは文字列と比較できません。ただし、ハンドルを削除しても、アプリケーションノードが変更されたことはもう観察されません。あなたの質問を洗練できますか? – Jay

答えて

24

これは、あなたがそれはあなたがブロック内handleに安全にアクセスできることを認識していないので、スウィフトに余分なステップを取る必要がある例です。これを回避作業の

一つの方法は次のとおりです。

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) 
    } 
}) 

明示的handle変数を初期化することにより、我々はスウィフト、コンパイラからエラーを取り除きます。しかし、ブロックが呼び出される前にハンドルが設定されている場合は、ブロック内でref.removeObserverWithHandle(handle)に安全に呼び出すことができます。

+0

これは私が必要とするものです、ありがとうFrank !!!! –

+1

.valueはノードのすべての値を返すので問題を引き起こしますこれは文字列と比較することができない辞書構造になるでしょうスナップショットの子どもがそうしていると思います。ブロック内のremoveAllObservers :-) – Jay

+0

構造上の良い点@Jay。しかし、私は 'ref.removeAllObservers()'を呼び出すことに同意しません。それは(名前が言うように)同じではないすべてのオブザーバーを取り除くでしょう。このシンプルスニペットではうまくいくかもしれませんが、一般的にリスナーを追加したり削除したりするのに対称性があります。 –

関連する問題