将元素追加到数组

时间:2020-03-12 15:49:55

标签: arrays swift firebase uitableview

我尝试将元素追加到数组中以供以后使用该数据,并将TableView创建为页首横幅。 我已经阅读了所有我能找到的帖子,但没有一个适合我。

我有一个Firebase数据库,可从其中获取UserData。这是节点:

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个以上的元素初始化数组,但是并没有改变任何东西。 我还读到它可能与以下事实有关:我使用了for-each循环,但我不知道如何解决它。

1 个答案:

答案 0 :(得分:2)

您需要刷新,因为从firebase获取数据的调用是异步的

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

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

并删除viewWillAppear,因为您嵌套了同义调用,所以您也可以起诉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()
        }