2017-02-10 6 views
1

なぜコードのデータを子供の値「scoreTotal」でソートするとは思わないのですか?私は値scoreTotalでソートしようとしましたが、子 "scoreTotal"によってクエリを実行しましたが、それはまだセルタイトルのアルファベット順にテーブルビューに表示されています。テーブルビューのFirebaseデータを子供の値で注文する

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

セルレンダリング機能の中で、そのデータを使用する必要のあるデータを照会しています。 Firebaseの呼び出しは非同期です。

cellForRowAtが呼び出されたときには、UITableViewは細胞をリサイクルすることを忘れないようにしてください。それはあなたが必要とするデータを呼び出す必要があります。あなたはその関数の中でそれらへの強い参照を取るべきではない(そうすることは許されていません)、その関数内からテーブルのソースデータ(あなたの場合はcomps[])を変更すべきではありません!

すべてのアプリケーションは異なりますが、一般的にこのクラスの「viewDidLoad」または「viewWillAppear」でこのデータをクエリするのが正しいパターンです。描画する新しいデータが到着すると、テーブルビュー(または適切なバッチ更新関数)でreloadDataを呼び出します。 cellForRowAtオーバーライドでは、このデータをすぐに利用できるようになり、適切にレンダリングできるようになります。

FirebaseUI(https://github.com/firebase/FirebaseUI-iOS)を見てください。これには、このロジックをすべて処理するテーブルビューとコレクションビューの両方のデータソースが含まれており、人生を楽にします。

関連する問題