我正在为将返回对象列表的函数生成一个完成处理程序。当它第一次返回值时,它工作得很好。但是,当对firebase数据库进行任何更改并再次调用observate时,数组大小将加倍。为什么要翻倍?

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)
  })
}

10-08 02:47