2017-07-30 35 views
0

我曾经打电话observe.value这会加载查询中的所有子项。实时,当一个孩子不再是查询的一部分时(即其时间戳太旧),该事件将被解雇,并且孩子的数据将从我的应用程序中删除。为了达到性能目的,我不单独使用.valueobserve联系,而是分别观察.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

我给你在这种情况下的简单解决方案。只需将直接父项添加到所有值。

rootNode: [ 
    { your first value } 
    { your second value } 
.... 
    /* you can add value here */ 
    {your last value } 
      ] 

现在,您不是观察每个值,而是观察它们的直接父母。这样,从dataSnapshot的定义中无论内部变化如何,它都会触发onMessageReceived()函数。

+0

我不确定我是否遵循 –

+0

@ArchieGertsman,为确切证明,请在此页查看此视频。他谈到DataSnapshot。 https://firebase.google.com/docs/web/setup –

+0

@ArchieGertsman,在那个rootNode里面的任何东西都被改变了,并且在rootNode上观察,然后根据DataSnapshot的定义,onMessageReceived()回调会在你身边触发。我对此100%肯定。 –