Добавление элементов в массив - PullRequest
0 голосов
/ 12 марта 2020

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

У меня есть база данных Firebase, откуда я получаю данные пользователя. Вот узел:

Firebase Node for a Single user

Здесь вы можете увидеть мой класс, который обрабатывает этот ViewController:

import UIKit
import FirebaseDatabase
import FirebaseAuth

class LeaderboardViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!
    var users:[User] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.reloadData()
    }

    override func viewWillAppear(_ animated: Bool) {
        load()
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "leaderCell") as! LeaderboardTableViewCell
        cell.placing.text = "\(indexPath.item+1)"
        cell.points.text = "\(indexPath.item + 20)"
        cell.name.text = "TestUser"
        return cell
    }

   func load(){
        let ref = Database.database().reference(withPath: "users")
        ref.observeSingleEvent(of: .value) { (snapshot) in
            let value = snapshot.value as? NSDictionary

            for key in value!.allKeys{
                ref.child("\(key)").observeSingleEvent(of: .value) { (snapshot) in
                    let userinfo = snapshot.value as? NSDictionary

                    let username = userinfo?.value(forKey: "username") as! String
                    let year = userinfo?.value(forKey: "year") as! String
                    let points = userinfo?.value(forKey: "points") as! Int

                    self.users.append(User(username: username, useryear: year, userpoints: points))
                }
            }
        }
    }
}

Я пытаюсь получить данные, когда мой ViewController «загрузится», так что, когда представление появилось, я могу перезагрузить данные TableView. Проблема в том, что полученные данные не будут сохранены в массив.

Я уже пытался инициализировать массив с 6+ элементами, но это ничего не изменило. Я также читал, что это может быть связано с тем, что я использую для каждого l oop, но я не мог понять, как это исправить.

1 Ответ

2 голосов
/ 12 марта 2020

Вам нужен refre sh, поскольку вызов для получения данных из firebase является асинхронным

 self.users.append(User(username: username, useryear: year, userpoints: points)) 
 tableView.reloadData()

И

override func viewDidLoad() {
    super.viewDidLoad()
    load() 
}

И удаление viewWillAppear, так как у вас есть вложенный синоним звонки вы также можете сделать sue из DispatchGroup, так что перезагрузка работает, когда все запросы выполнены

        let g = DispatchGroup()  /// 1
        for key in value!.allKeys{
            g.enter() /// 2
            ref.child("\(key)").observeSingleEvent(of: .value) { (snapshot) in
                let userinfo = snapshot.value as? NSDictionary

                let username = userinfo?.value(forKey: "username") as! String
                let year = userinfo?.value(forKey: "year") as! String
                let points = userinfo?.value(forKey: "points") as! Int 
                self.users.append(User(username: username, useryear: year, userpoints: points))

                g.leave() //// 3
            }
        }

        g.notify(queue:.main) {  // 4
          tableView.reloadData()
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...