Completion handler Firebase observer in Swift

后端 未结 4 1448
日久生厌
日久生厌 2021-01-17 01:11

I am making a completion handler for a function which will return a list of objects. When it return value for first time, it works well. But when any change happen into fire

相关标签:
4条回答
  • 2021-01-17 01:14

    Create a Model as below

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

    Use the below code in the view controller and you should be able to see content in your 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)
    }
    
    0 讨论(0)
  • 2021-01-17 01:21
    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")
            }
            
        })
    }}
    
    0 讨论(0)
  • 2021-01-17 01:23

    This line stadiumRef.observe(.value, with: { (snapshot) in ... actually adding an observer that will be called everytime your stadium data is changed.

    Because you called it twice by using getStadiums(){ stadiums ..., the total observer added will be 2.

    That makes the line stadiums.append(stadium) called twice in the second call.

    My suggestion would be to use stadiumRef.observe() once without calling it from getStadiums().

    0 讨论(0)
  • 2021-01-17 01:33

    The code you're using declares stadiums outside of the observer. This means any time a change is made to the value of the database reference, you're appending the data onto stadiums without clearing what was there before. Make sure to remove the data from stadiums before appending the snapshots again:

    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 讨论(0)
提交回复
热议问题