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





К сожалению, это не функция 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.
нет, я сделал и то, и другое, но я получил это сообщение «отзыв отправлен, спасибо за отзыв! броски тех, у кого репутация менее 15, записываются, но не изменяют публично отображаемый рейтинг публикации»
Вы отметили его как правильный ответ, но не проголосовали за него. Извините, если это раздражает