我尝试将元素追加到数组中以供以后使用该数据,并将TableView创建为页首横幅。 我已经阅读了所有我能找到的帖子,但没有一个适合我。
我有一个Firebase数据库,可从其中获取UserData。这是节点:
在这里您可以看到处理该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循环,但我不知道如何解决它。
答案 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()
}