简体   繁体   中英

Can't load in values for tableview cell firebase

I'm trying to load in different values for each cell in a tableview. Currently, I load in a teamID, display it on the current cell, then use that ID to load in the other attributes of the team.

    self.ref?.child("Teams").child(currentTeamID).child("Number").observeSingleEvent(of: .value, with: { (snapshot) in
                let number1 = snapshot.value as? Int
                if let teamNum = number1 {
                    Cell.teamNumber.text = "team " + String(teamNum)
                    //breakpoint
                }
            })
            self.ref?.child("Teams").child(currentTeamID).child("memberCount").observeSingleEvent(of: .value, with: { (snapshot) in
                let memcon = snapshot.value as? Int
                if let membercount = memcon {
                    Cell.userCount.text = "Members: " + String(membercount)
                    //breakpoint
                }
            })
        return Cell

My issues comes when trying to load in these other attributes. Should I be doing this is a different way? Right now it loads only the second .observeSingleEvent I have tried placing breakpoint where I indicated above, but only the second one ever gets hit. Do I need a separate reference or is there a way to load all the values from a parent object?

Thanks a whole bunch.

Added Firebase Structure:

ftc-scouting-app
    Teams
        Brophy Robotics
            Name: "Brophy Robotics"
            Number: "201"
            Password: "bronco"
            memberCount: 2
            memberList
                 member1: "5ilQc8KlrERLAmtFXjWaOZLIcoC3"
                 member2: "syV9SS6S9hY8PyKBOC0VQ3NNv0v2"

    Users
        5ilQc8KlrERLAmtFXjWaOZLIcoC3
            (User Info Values)
        syV9SS6S9hY8PyKBOC0VQ3NNv0v2
            (User Info Values

The values I'm trying to load are the team number and the member count. I want to put them on the cell as it loads in each team that each user has. So, I just need it to load each value and put it on my custom table view cell that has all the fields for it. To clarify - I already know that it retrieves the team ID properly because it is able to put it on the cell.

The value currentTeamID is a value that I have already loaded in, and is the id (which is the same as the name) of the current cell's prospective team.

First, change the structure

ftc-scouting-app
    Teams
        Jyis9009kos0kslk  //should be generated with childByAutoId()
            Name: "Brophy Robotics"
            Number: "201"
            Password: "bronco"
            memberCount: "2"
            memberList:
                 5ilQc8KlrERLAmtFXjWaOZLIcoC3: true //uid as the key
                 syV9SS6S9hY8PyKBOC0VQ3NNv0v2: true

    Users
        5ilQc8KlrERLAmtFXjWaOZLIcoC3
            (User Info Values)
        syV9SS6S9hY8PyKBOC0VQ3NNv0v2
            (User Info Values)

Then, let's retrieve just the one team node and get some data

let teamsRef = self.ref.child("ftc-scouting-app").child("Teams")
let thisTeamRef = teamsRef.child("Jyis9009kos0kslk")

thisTeamRef.observeSingleEvent(of: .value, with: { snapshot in

    let teamDict = snapshot.value as! [String: AnyObject]

    let teamName = teamDict["Name"] as! String
    print(teamName)
    let memCount = teamDict["memberCount"] as! String
    print(memCount)
    let memberList = teamDict["memberList"] as! [String: AnyObject]

    for user in memberList {
        print(user.key)
    } 
})

and the output is

Brophy Robotics
2
5ilQc8KlrERLAmtFXjWaOZLIcoC3
syV9SS6S9hY8PyKBOC0VQ3NNv0v2

each event events asynchronously. you should use completion block in your each event.

    func getNumber (completion: @escaping (String)->()){self.ref?.child("Teams").child(currentTeamID).child("Number").observeSingleEvent(of: .value, with: { (snapshot) in
                let number1 = snapshot.value as? Int
                if let teamNum = number1 {
                    completion(String(teamNum))
                }
            })}

     getNumber(completion: {(teamNum) in 
    self.ref?.child("Teams").child(currentTeamID).child("memberCount").observeSingleEvent(of: .value, with: { (snapshot) in
                    let memcon = snapshot.value as? Int
                    if let membercount = memcon {
                        Cell.teamNumber.text = "team " + teamNum
                        Cell.userCount.text = "Members: " + String(membercount)
                        //breakpoint
                    }
                })
    })

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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