为什么不认为代码按子值“scoreTotal”的值排序数据?我尝试按值scoreTotal排序并按子“scoreTotal”查询,但它仍然以表格视图中的单元格标题的字母顺序显示。
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CellMale", for: indexPath as IndexPath)
let comp = comps[indexPath.row]
let dbRef1 = FIRDatabase.database().reference().child("Live Scoring Male/\(String(describing: comp.name!))/scoreTotal")
dbRef1.queryOrdered(byChild: "scoreTotal").observe(FIRDataEventType.value, with: { (snapshot) in
let scoreTotal = snapshot.value as! Double
cell.detailTextLabel?.text = String(scoreTotal)
self.comps.sorted(by: {$0.scoreTotal > $1.scoreTotal})
})
cell.textLabel?.text = comp.name
return cell
}
答案 0 :(得分:0)
您正在查询需要使用该数据的单元格渲染功能中的数据。 Firebase调用是异步的。您必须在需要之前调用所需的数据,然后在它到达时对其进行响应。
调用cellForRowAt
时,请不要忘记UITableView
是否会回收细胞。您不应该(不允许)在该函数中对它们进行强有力的引用,并且您当然不应该从该函数中更改表的源数据(在您的情况下为comps[]
) !
每个应用程序都不同,但通常是"对等"这里的模式是在您的班级viewDidLoad
或viewWillAppear
覆盖中查询此数据。当新数据到达您想要绘制时,在tableview(或适当的批量更新函数)上调用reloadData
。在cellForRowAt
覆盖中,您将立即获得此数据,并且能够正确呈现它。
你一定要看看FirebaseUI(https://github.com/firebase/FirebaseUI-iOS)。它包括表格和集合视图的数据源,可以为您处理所有这些逻辑,并将使您的生活更轻松。