2017-03-09 8 views
0

マイリアルタイムデータベースは次のようになります動作しません:それはあなたが見ることができるように1つだけの子供が含まれていObserveSingleEventは良い

enter image description here

。数分前にRunningGamesに4人の子供がいました。私はブラウザでそれらを削除しました。今すぐ呼び出すとき:

private lazy var runningGamesRef: FIRDatabaseReference = FIRDatabase.database().reference().child("RunningGames") 
self.runningGamesRef.observeSingleEvent(of: .value, with: { (snapshot) -> Void in 
      for gameSnap in snapshot.children { 
       let id = (gameSnap as! FIRDataSnapshot).key 
       print(id) 
} 
}) 

それでもブラウザで削除したゲームは印刷されます。私のアプリケーションでrunningGameRef!.removeValues()を呼び出すと、ブラウザーとiPhoneでそれが削除されます(print(id)は固定されています)。私はRunningGamesの子供だけでなく、さまざまな子供の複数のobserveSingleEvent関数でこのエラーが発生します。この迷惑なエラーの原因は何ですか?

RunningGamesの子供の中には子供もいますが、アプリで自動的に削除されます。ただし、observeSingleEventを呼び出すときにもこれらの値が表示されます。

+1

私は推測していた場合、私はそれはおそらく、デバイスのローカルキャッシュから古くなった情報を取得していますと言うだろう。 –

+0

persistenceEnabledはyesに設定されていますか? – Jay

+0

はい、それは問題の原因でしょうか? – Petravd1994

答えて

1

おそらく古い情報を保持しているローカルキャッシュです。これは、複数のソースからデータを操作しているときによく発生します。

observeSingleEventの代わりにobserveを使用してみます。私はそれがちょっと奇妙だということを知っています(データを一度ロードしたいだけの場合は本当に必要なものではありません)が、それはあなたの情報を最新の状態に保つはずです。

これを行うと、情報を1度だけ取得できます。

var handle: UInt = 0 
    handle = ref.observe(.value, with: { snapshot in 
    for gameSnap in snapshot.children { 
     let id = (gameSnap as! FIRDataSnapshot).key 
     print(id) 
    } 
    ref.removeObserver(withHandle: handle) 
}) 

Source of the code (Frank van Puffelen)

+0

実際にデータを一度ロードする方法はありませんか?私はちょうどいくつかの部屋でいくつかの値をチェックしたい...それは正常に動作しない奇妙ですが、それはローカルキャッシュに保存すべきではありません。私はちょうどその時の値を一度だけチェックしたいと思う。 – Petravd1994

+0

私の答えを編集して、それを試すことができます。 –

+0

"引数ラベルが使用可能なオーバーロードと一致しません"私はobserveSingleEventでスナップショットから取得した値をループしたいからだと思います。スナップショットを見ることができますか? – Petravd1994

関連する問題