繁体   English   中英

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

[英]Completion handler Firebase observer in 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)
  })
}

这条线stadiumRef.observe(.value, with: { (snapshot) in ...实际上添加了一个观察者,每次更改体育场数据时都会调用该观察者。

因为您使用getStadiums(){ stadiums ...调用了它两次,所以添加的观察者总数将为 2。

这使得行stadiums.append(stadium)在第二次调用中调用了两次。

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

创建一个模型如下

class OrderListModel: NSObject {
    var Order:String?
    var Date:String?
}

在视图控制器中使用以下代码,您应该能够在 tableview 中看到内容

func getOrdersData()  {
    self.orderListArr.removeAll()
    let ref = Database.database().reference().child(“users”).child(user).child("Orders")

        ref.observe(.childAdded, with: { (snapshot) in
            print(snapshot)
            guard let dictionary = snapshot.value as? [String : AnyObject] else {
                return
            }

            let orderObj = OrderModel()
            orderObj.Order = dictionary[“Order”] as? String
            orderObj.Date = dictionary[“Date”] as? String

            self.orderListArr.append(orderObj)
            self.tableView.delegate = self
            self.tableView.dataSource = self
            self.tableView.reloadData()

        }, withCancel: nil)
}
func ListenForChildrenAdded() {

let registerToListenTo = "YourPathHere"

ref.child(registerToListenTo).observeSingleEvent(of: .value) { (snapshot) in
    
    let initialChildren = snapshot.childrenCount
    var incrementer = 0
    
    ref.child(registerToListenTo).observe(.childAdded, with: { (snapshot) in
        
        incrementer += 1
        print("snapshot: \(snapshot.key) #\(incrementer)")

        if incrementer == initialChildren {
            print("-> All children found")
        } else if incrementer > initialChildren {
            print("-> Child Was Added - Run Some Code Here")
        }
        
    })
}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM