TableView在顶部从Firestore添加newScore,即使它不是最高分数

时间:2019-06-02 14:10:14

标签: ios swift firebase google-cloud-firestore

我正在尝试将排行榜放在一起。效果很好,除非每当我在设备上创建新版应用程序时,当玩家将自己的乐谱添加到数据库中时,都没有问题。但是,当播放器随后单击以查看排行榜时。结果全都以正确的顺序显示,但是玩家的新分数位于最前面(即使不是最高分数)。然后在正确的位置再次看到相同的分数。

这仅在新版本中第一次发生。如果我返回并再次播放,则顺序很好,并且乐谱仅位于正确的位置。

我已经尝试在用户启动新版本来模拟排行榜上的位置作为用户时向数据库添加虚拟分数。但这会被添加到排行榜的顶部以及他们的新分数(无论是否最高)。

var scoresArray = [ScoreClass]()

class ScoreClass {

    var name = ""
    var score = 0

    init(withName: String, andScore: Int) {
        name = withName
        score = andScore
    }
}

正在将数据添加到数据库中。...

func addingScoreToFB() {
    let score = Int(self.recentScores.last ?? "")
    if score ?? 0 > Int(playerHighScore ?? "") ?? 0 { {
        if let username = usernameText {
            let newScore = TopScore(username: username, highScore: (score)!)
            var ref:DocumentReference? = nil
            ref = self.db.collection("users").addDocument(data: newScore.dictionary) {
                error in
                    if let error = error {
                        print("Error adding document:\(error.localizedDescription)")
                    } else {
                        print("Document added with reference: \(ref!.documentID)")
                }
            }
        }
    }
}

获取数据

let ref = Database.database().reference()

func retrieveUserData() {

    let postsRef = self.db.collection("users")

    let query = postsRef
                    .order(by: "highScore", descending: true)
                    .limit(to: 50)

    query.addSnapshotListener { (documentSnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in documentSnapshot!.documents {
                    print("\(document.documentID) => \(document.data())")
                    let dict = document.data()
                    let name = dict["username"] as! String
                    let score = dict["highScore"] as! Int
                    let aScore = ScoreClass(withName: name, andScore: score)
                    self.scoresArray.insert(aScore, at: 0)
                }

            self.topScoresTableView.reloadData()
            }
    }
}

我不确定数据库检索是否有任何问题,但是我不明白为什么这只会在第一次播放的新版本中受到影响。提供的任何帮助将不胜感激。

编辑:包括tableView显示功能和scoreObject

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = topScoresTableView.dequeueReusableCell(withIdentifier: textCellIdentifier, for: indexPath) as! TableViewCell
    let row = indexPath.row
    let scoreClassObject = scoresArray.reversed()[row]
    let name = scoreClassObject.name
    let score = scoreClassObject.score
    cell.backgroundColor = UIColor.clear
    cell.usernameLabel.text = name
    cell.resultLabel.text = String(score)
    cell.rankNumberLabel.text = "\(indexPath.row + 1)"
    print(scoresArray)
    return cell
}

2 个答案:

答案 0 :(得分:1)

我可能没有完全理解这个问题,所以这是一个“测试版”答案,可能需要更新。

查看问题中的代码,似乎您要按降序显示的数据的顺序已更改了好几次,而这不必要。

它以降序读取,但是由于元素如何添加到数组中而又再次上升; .insert(aScore,at:0)。但是,在填充tableView单元格时,正在读取的数据将再次反转。

让我们总分4分; 2,3,1,0

然后是现有查询,以降序读取它们。

let query = postsRef
                .order(by: "highScore", descending: true)
                .limit(to: 50)

Firestore闭包将按降序显示数据,因此可以将其添加到数组中

 self.scoresArray = [] //***start with an empty array, and clear it each time
 for document in documentSnapshot!.documents {
                    let dict = document.data()
                    let name = dict["username"] as! String
                    let score = dict["highScore"] as! Int
                    let aScore = ScoreClass(withName: name, andScore: score)
                    self.scoresArray.insert(aScore) //***NOTE THE CHANGE***
                }

该数组将包含分数

[index 0] = 3
[index 1] = 2
[index 2] = 1
[index 3] = 0

然后填充每一行的单元格

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = topScoresTableView.dequeueReusableCell(withIdentifier: textCellIdentifier, for: indexPath) as! TableViewCell
    let row = indexPath.row
    let scoreObject = self.scoresArray[row] //***NOTE THE CHANGE***
    let score = scoreObject.score
    cell.resultLabel.text = String(score)
    return cell
}

您的表格视图将包含所有得分降序的

请注意,需要self.scoresRef = [],因为每当添加或删除新的乐谱文档时,所有乐谱都会重新加载,因此我们需要清除数组并每次重新开始。

答案 1 :(得分:0)

您将通过以下操作在索引0处插入新条目:

Command

您需要在此处对其进行排序,然后根据您想要的排序将其插入适当的位置。

或者,您也可以在添加新条目之后运行self.scoresArray.insert(aScore, at: 0) ,以使Firebase在查询级别为您进行排序。