TableView добавляет newScore из пожарного магазина наверху, даже если это не самый высокий балл - PullRequest
0 голосов
/ 02 июня 2019

Я пытаюсь собрать таблицу лидеров вместе.Это работает хорошо, за исключением случаев, когда я создаю новую сборку своего приложения на своем устройстве, когда игрок добавляет свой счет в базу данных, нет проблем.Однако, когда игрок нажимает, чтобы увидеть таблицу лидеров.Все результаты отображаются в правильном порядке, однако новый счет игроков ставится сверху (даже если это не самый высокий счет).Затем тот же результат снова отображается в правильном положении.

Это происходит только в первый раз при новой сборке.Если я вернусь и воспроизведу его снова, порядок в порядке, и счет размещен только в правильном месте.

Я уже пытался добавить фиктивный счет в базу данных, когда пользователь запускает новую сборку для имитациипозиция в таблице лидеров в качестве держателя размещения.Но это затем добавляется в верхнюю строчку списка лидеров, а также их новый счет (независимо от того, является ли он самым высоким или нет).

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 ]

1 голос
/ 03 июня 2019

Возможно, я не совсем понимаю вопрос, поэтому это «бета» ответ, который, возможно, потребуется обновить.

Если посмотреть на код в вопросе, то появятся данные, которые вы хотите отобразить вв порядке убывания - его порядок меняется несколько раз, и в этом нет необходимости.

Он читается в порядке убывания, но затем снова возрастает из-за того, как элементы добавляются в массив;.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 = [] необходим, потому что каждый раз, когда новый документ с оценками добавляется, изменяется или удаляется, ВСЕ результаты будут перезагружены, поэтому нам нужно очистить массив и начать каждый новыйвремя.

0 голосов
/ 02 июня 2019

Вы вставляете новые записи с индексом 0, выполняя это:

self.scoresArray.insert(aScore, at: 0)

Вам необходимо отсортировать его здесь и вставить в нужное место на основе необходимой вам сортировки.

В качестве альтернативы вы можете просто запустить свой query после добавления новой записи, чтобы позволить Firebase выполнить для вас сортировку на уровне запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...