Когда я вызываю следующий метод, Firebase постоянно обновляет с шагом 5 вместо того, чтобы просто отправлять одно обновление. Почему это? - PullRequest
0 голосов
/ 20 апреля 2020

Я использую Firebase в качестве своего бэкэнда и пытаюсь увеличить число, которое в данный момент хранится в базе данных, на 5. Однако, когда он вызывается, база данных добавляет 5 снова и снова, поэтому счет идет от 5 до 10 до 15 ... это повторяется до тех пор, пока не произойдет сбой приложения.

Почему это происходит?

func changeUserRewardsScore() {
        let db = Firestore.firestore()
        db.collection("\(Auth.auth().currentUser?.uid ?? "default")").document("score")
            .addSnapshotListener { (querySnapshot, error) in
            if let e = error {
                print("There was an issue retrieving data from Firestore. \(e)")
            }
            else {
                if let data = querySnapshot?.data() {
                    let myArray = Array(data.values)
                    let userScore = "\(myArray[0])"
                    print("userScore = \(userScore)")
                    self.writeUserScore(score: userScore)
                }
            }
        }
    }

    func writeUserScore(score: String) {
        var myScore = 0
        if localData.rewards.freeCookieInCart == true  && score == "50" {
            myScore = 0
        }
        else {
            myScore = Int(score)!+5
        }
        let db = Firestore.firestore()
        db.collection("\(Auth.auth().currentUser?.uid ?? "default")").document("score").setData(["score":myScore]) {
            (error) in
            if let e = error {
                print("There was an issue saving data to firestore, \(e)")
            } else {
                print("Successfully saved data.")
                DispatchQueue.main.async {
                }
            }
        }
    }

1 Ответ

1 голос
/ 20 апреля 2020

Ваш прослушиватель документов при запуске записывает обратно в тот же документ, который его инициировал, поэтому он запускается снова с результатом этого изменения. Который начинает весь цикл заново.

Мне не ясно, что вы ожидаете вместо этого, но если вы просто хотите получить значение документа один раз, то обновите его, вы должны использовать get() вместо onSnapshot(), как показано в документации . Либо так, либо установите какое-либо состояние в вашем объекте, которое указывает вашему слушателю, когда он не должен обновлять документ снова.

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