2017-07-30 7 views
0

observe.valueと呼んで、クエリ内のすべての子をロードしました。子供がクエリの一部になっていない(タイムスタンプが古すぎる)場合は、.valueイベントが発生し、子供のデータがアプリから削除されます。パフォーマンス上の理由から、observe.valueと呼ぶ代わりに、.childAdded,.childChanged、および.childRemovedイベントを個別に観察します。しかし、子プロセスがもはやクエリの一部でなく、子プロセスのデータがアプリケーションに残っていると、これらのイベントは発生しません。私は.childMovedを観察しようとしましたが、どちらも解雇されませんでした。 .valueの観察のこの側面をどのように再現できますか?私を表すコードは次のとおりです。Firebaseはクエリの一部ではなくなった子を削除します

class ViewController: UIViewController { 

    var children_query: DatabaseQuery! 
    var current_time: TimeInterval { 
     return Date().timeIntervalSince1970 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.children_query = Database.database().reference().child("children").queryOrdered(byChild: "timestamp").queryStarting(atValue: current_time) 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     // refresh query every time this view appears (this is the root view controller so it comes and goes) 
     self.children_query = Database.database().reference().child("children").queryOrdered(byChild: "timestamp").queryStarting(atValue: current_time) 

     self.children_query.observe(.childAdded, with: { snapshot in 
      print(snapshot.value) 
     }) 

     self.children_query.observe(.childChanged, with: { snapshot in 
      print(snapshot.value) 
     }) 

     self.children_query.observe(.childRemoved, with: { snapshot in 
      print(snapshot.value) 
     }) 

     self.children_query.observe(.childMoved, with: { snapshot in 
      print(snapshot.value) 
     }) 
    } 

    override func viewDidDisappear(_ animated: Bool) { 
     super.viewDidDisappear(animated) 
     self.children_query.removeAllObservers() 
    } 
} 

答えて

0

私はあなたにこの状況で簡単な解決策を教えています。直接の親をすべての値に追加するだけです。

ここで、各値を観察するのではなく、直接の親を観察します。そのようにして、内部の変更が何であれdataSnapshotの定義から、それはonMessageReceived()の機能を起動します。

+0

私は –

+0

@ArchieGertsmanに従っているかどうかはわかりませんが、正確な証拠はこのページでこの動画をご覧ください。彼はDataSnapshotについて語っています。 https://firebase.google.com/docs/web/setup –

+0

@ArchieGertsman、そのルートノード内で何かが変更され、rootNodeを監視すると、DataSnapshotの定義に基づいて、あなたの側でonMessageReceived()コールバックがトリガーされます。私はこれについて100%確信しています。 –

関連する問題