2017-09-14 72 views
0

我正在爲將返回對象列表的函數創建一個完成處理程序。當它第一次返回值時,它運行良好。但是,當任何更改發生在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 
} 

回答

4

您使用的代碼在觀察者之外聲明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 :)它真的有效 –

0

此行stadiumRef.observe(.value, with: { (snapshot) in ...實際添加將被調用每次你的球場數據被更改的觀察員。

因爲你把它叫做兩次通過getStadiums(){ stadiums ...,增加了總的觀察者將是2

這使得在第二個電話打了兩次電話線路stadiums.append(stadium)

我的建議是使用stadiumRef.observe()而不是從getStadiums()調用它。