按子值在表格视图单元格中对Firebase数据进行排序

时间:2017-02-10 05:34:51

标签: ios sorting firebase firebase-realtime-database

为什么不认为代码按子值“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

}

1 个答案:

答案 0 :(得分:0)

您正在查询需要使用该数据的单元格渲染功能中的数据。 Firebase调用是异步的。您必须在需要之前调用所需的数据,然后在它到达时对其进行响应。

调用cellForRowAt时,请不要忘记UITableView是否会回收细胞。您不应该(不允许)在该函数中对它们进行强有力的引用,并且您当然不应该从该函数中更改表的源数据(在您的情况下为comps[]) !

每个应用程序都不同,但通常是"对等"这里的模式是在您的班级viewDidLoadviewWillAppear覆盖中查询此数据。当新数据到达您想要绘制时,在tableview(或适当的批量更新函数)上调用reloadData。在cellForRowAt覆盖中,您将立即获得此数据,并且能够正确呈现它。

你一定要看看FirebaseUI(https://github.com/firebase/FirebaseUI-iOS)。它包括表格和集合视图的数据源,可以为您处理所有这些逻辑,并将使您的生活更轻松。