Запрос Firebase не заполняет массив для табличного представления. Как я могу решить эту проблему? - PullRequest
1 голос
/ 24 апреля 2019

Я написал запрос Firebase, который получает информацию из моей базы данных Competition и затем загружает ее в мои distanceData (который имеет тип distanceModel, класс, который я создал) перед заполнением табличного представления. Однако табличное представление не заполняется.

Фотография Firebase db

enter image description here

Фотография класса DistanceModel

enter image description here

Я попытался вставить операторы print в запрос, чтобы проверить, правильно ли извлекаются данные, но ничего не печатается, поэтому проблема, скорее всего, связана с запросом.

var distanceData = [distanceModel]()

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate=self
    tableView.dataSource=self
    self.tableView.rowHeight = 200

    refUser = Database.database().reference().child("userInfo");

    let userID = Auth.auth().currentUser!.uid
    let query = refUser?.queryOrdered(byChild: "userId").queryEqual(toValue: "\(userID)")
    query?.observeSingleEvent(of: .value, with: { snapshot in
        for child in snapshot.children {
            let childSnap = child as! DataSnapshot
            var dict = childSnap.value as! [String: Any]
            let level=dict["level"] as! String
            if (level=="Beginner") {
                self.refCompetition = Database.database().reference().child("competition1");
            }

            else if (level=="Intermediate") {
                self.refCompetition = Database.database().reference().child("competition2");
            }

            else {
                self.refCompetition = Database.database().reference().child("competition3");
            }
        }
    })

получить сообщения и прослушать изменения

refCompetition?.observe(DataEventType.value, with: { (snapshot) in

        for users in snapshot.children.allObjects as! [DataSnapshot] {
            let userObject = users.value as? [String: AnyObject]
            let userName = userObject?["name"] as! String?
            let userDistance = userObject?["distance"] as! String?
            print(userName)
            print(userDistance)


            let dist = distanceModel(name: userName,distance: userDistance)

            self.distanceData.append(dist)
        }
    })

    self.tableView.reloadData()
}

Количество рядов

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return distanceData.count;
}

Содержимое для каждой ячейки

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "DistanceCell", for: indexPath) as! DistanceCell

    let dist: distanceModel
    dist = distanceData[indexPath.row]
    cell.nameLabel.text = dist.name
    cell.distanceLabel.text = dist.distance

    cell.rankNumber.text = String (indexPath.row+1)

    return cell
}

Он должен получить данные из соответствующей базы данных соревнований и затем отобразить результаты в табличном представлении.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Как насчет этого?

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self
    self.tableView.rowHeight = 200

    refUser = Database.database().reference().child("userInfo");

    let userID = Auth.auth().currentUser!.uid
    let query = refUser?.queryOrdered(byChild: "userId").queryEqual(toValue: "\(userID)")
    query?.observeSingleEvent(of: .value, with: { snapshot in
        for child in snapshot.children {
            let childSnap = child as! DataSnapshot
            var dict = childSnap.value as! [String: Any]
            let level = dict["level"] as! String

            if (level == "Beginner") {
                self.refCompetition = Database.database().reference().child("competition1");
            }
            else if (level == "Intermediate") {
                self.refCompetition = Database.database().reference().child("competition2");
            }
            else {
                self.refCompetition = Database.database().reference().child("competition3");
            }

            self.refCompetition?.observe(.value, with: { (snapshot) in

                for users in snapshot.children.allObjects as! [DataSnapshot] {
                    let userObject = users.value as? [String: AnyObject]
                    let userName = userObject?["name"] as! String?
                    let userDistance = userObject?["distance"] as! String?
                    print(userName)
                    print(userDistance)

                    let dist = distanceModel(name: userName,distance: userDistance)
                    self.distanceData.append(dist)
                }

                DispatchQueue.main.async {
                  self.tableView.reloadData()
                }
            })        
        }
    })
}
0 голосов
/ 24 апреля 2019

Попробуйте переместить вызов self.tableView.reloadData () в Observer, как показано ниже

refCompetition?.observe(DataEventType.value, with: { (snapshot) in

        for users in snapshot.children.allObjects as! [DataSnapshot] {
            let userObject = users.value as? [String: AnyObject]
            let userName = userObject?["name"] as! String?
            let userDistance = userObject?["distance"] as! String?
            print(userName)
            print(userDistance)


            let dist = distanceModel(name: userName,distance: userDistance)

            self.distanceData.append(dist)
        }

self.tableView.reloadData()
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...