Получение старого значения поля в Firestore с помощью Swift 5

Я пытаюсь получить старое значение поля при его изменении в Firestore. Есть ли способ получить доступ к предыдущему значению поля после его изменения? Вот мой текущий код, я хочу получить доступ к старому nickName под .modified и распечатать, что такое новый nickName, а также старый.

db.collection("cities").whereField("state", isEqualTo: "CA").addSnapshotListener { querySnapshot, error in
    guard let snapshot = querySnapshot else {
        print("Error fetching snapshots: \(error!)")
        return
    }
    snapshot.documentChanges.forEach { diff in
        if (diff.type == .added) {
            print("New city: \(diff.document.data())")
        let nickName = myData["nickName"] as? String ?? ""
        }
        if (diff.type == .modified) {
            let nickName = myData["nickName"] as? String ?? ""
        }
        if (diff.type == .removed) {
            let nickName = myData["nickName"] as? String ?? ""
        }
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 006
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

К сожалению, это не функция Firestore. Что вы можете сделать, так это иметь другое поле oldNickName и с помощью функций Firebase автоматически обновлять его при изменении поля nickName.

Лучшее решение — хранить nickName локально, чтобы вы могли обращаться к своей локальной переменной при изменении nickName, получая доступ к недавно обновленной переменной в базе данных и к предыдущей nickName локально. Вот обновленный код:

var nickNames = [String : String]()
db.collection("cities").whereField("state", isEqualTo: "CA").addSnapshotListener { snapshot, error in
    guard error == nil, let snapshot = snapshot?.documentChanges else { return }
    snapshot.forEach {
        let document = $0.document
        let documentID = document.documentID
        let nickName = document.get("nickName") as? String ?? "Error"
        switch $0.type {
            case .added:
                print("New city: \(document.data())")
                nickNames[documentID] = nickName
            case .modified:
                print("Nickname changed from \(nickNames[documentID]) to \(nickName)")
                nickNames[documentID] = nickName
            case .removed:
                print("City removed with nickname \(nickNames[documentID])")
                nickNames.removeValue(forKey: documentID)
        }
    }
}

nickNames — это словарь с ключом cityID и значением nickName. Этот код написан на Swift 5.

Вы отметили его как правильный ответ, но не проголосовали за него. Извините, если это раздражает

Ken Mueller 01.04.2019 19:29

нет, я сделал и то, и другое, но я получил это сообщение «отзыв отправлен, спасибо за отзыв! броски тех, у кого репутация менее 15, записываются, но не изменяют публично отображаемый рейтинг публикации»

Fadi Sahouri 01.04.2019 19:37

Другие вопросы по теме

В мое приложение Swift добавлена ​​цель командной строки, но она не видит остальную часть проекта
Подождите, пока изображение будет загружено, прежде чем продолжить функцию - Swift 5 Firebase Storage
Добавил библиотеку в мой существующий проект, она успешно построена на симуляторе, но не работает на реальном устройстве, я не могу запустить ее на устройстве
Есть ли способ классифицировать тип устройств в списке сканирования Bluetooth и получить адрес Mac в Objective C?
Как переименовать кнопку в другом контроллере представления с именем пользователя firebase из ячейки UIView?
Ошибка сеанса Appium не существует после обновления до последней версии
Комментирование представления на основной раскадровке
Сборка не отображается в тестовом полете после обработки?
Экспорт файла ios .ipa без учетной записи разработчика во флаттере
Как исправить файл firebase_auth/FirebaseAuthPlugin.h, не найденный в Xcode?