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

Я пытаюсь получить старое значение поля при его изменении в 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 ?? ""
        }
    }
}

1 Ответ

1 голос
/ 31 марта 2019

К сожалению, это не особенность Firestore.Что вы можете сделать, так это иметь другое поле oldNickName и, используя Firebase Functions, автоматически обновлять его при изменении поля 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.

...