完成处理程序在Swift中的Firebase观察者

问题描述:

我正在为将返回对象列表的函数创建一个完成处理程序。当它第一次返回值时,它运行良好。但是,当任何更改发生在firebase数据库中,并且再次观察被调用时,数组大小会增加一倍。为什么它会翻倍?完成处理程序在Swift中的Firebase观察者

func getStadiums(complition: @escaping ([Stadium]) -> Void){ 
    var stadiums: [Stadium] = [] 
    let stadiumRef = Database.database().reference().child("Stadium") 
    stadiumRef.observe(.value, with: { (snapshot) in 
    for snap in snapshot.children { 
     guard let stadiumSnap = snap as? DataSnapshot else { 
     print("Something wrong with Firebase DataSnapshot") 
      complition(stadiums) 
      return 
     } 
     let stadium = Stadium(snap: stadiumSnap) 
     stadiums.append(stadium) 
    } 
    complition(stadiums) 
    }) 
} 

,并呼吁像这样

getStadiums(){ stadiums 
    print(stadiums.count) // count gets doubled up after every observe call 
} 

您使用的代码在观察者之外声明stadiums。这意味着无论何时对数据库引用的值进行更改,您都会将数据追加到stadiums而不清除之前的内容。确保在再次追加快照之前从stadiums中删除数据:

func getStadiums(complition: @escaping ([Stadium]) -> Void){ 
    var stadiums: [Stadium] = [] 
    let stadiumRef = Database.database().reference().child("Stadium") 
    stadiumRef.observe(.value, with: { (snapshot) in 
    stadiums.removeAll() // start with an empty array 
    for snap in snapshot.children { 
     guard let stadiumSnap = snap as? DataSnapshot else { 
     print("Something wrong with Firebase DataSnapshot") 
      complition(stadiums) 
      return 
     } 
     let stadium = Stadium(snap: stadiumSnap) 
     stadiums.append(stadium) 
    } 
    complition(stadiums) 
    }) 
} 
+0

Thanks @Jen :)它真的有效 –

此行stadiumRef.observe(.value, with: { (snapshot) in ...实际添加将被调用每次你的球场数据被更改的观察员。

因为你把它叫做两次通过getStadiums(){ stadiums ...,增加了总的观察者将是2

这使得在第二个电话打了两次电话线路stadiums.append(stadium)

我的建议是使用stadiumRef.observe()而不是从getStadiums()调用它。