Моя основная цель - совместить нумерацию страниц в firestore с функцией реального времени. Есть ли способ узнать в Snapshotlistener, был ли объект удален, потому что он больше не соответствовал запросу или был ли удален объект? В документации для FIRDocumentChangeTypeRemoved говорится: «(либо удалено, либо больше не соответствует запросу». Есть ли способ узнать, какой из них действительно произошел?
Мой подход выглядит следующим образом:
override func viewDidLoad() {
super.viewDidLoad()
getFirstBatchOfItems()
}
private func getFirstBatchOfItems() {
//getting initial 20 items and storing them in an array 'items'
self.startListeningForUpdates()
}
private func startListeningForUpdates() {
questionItemsListener = Firestore.firestore()
.collection("items")
.whereField("active", isEqualTo: true)
.order(by: "updated", descending: true)
.limit(to: 5) //keep track of the last 5 updates
.addSnapshotListener({ (querySnapshot, error) in
guard let querySnapshot = querySnapshot else {
print("Error fetching querySnapshot: \(error!)")
return
}
querySnapshot.documentChanges.forEach { (diff) in
switch diff.type {
case .added:
if let newItem = try docSnapshot?.data(as: Item.self) {
//only add new items if these dont exist in the items list yet
if !self.items.contains(newItem) {
self.items.append(newItem)
}
}
case .modified:
if let modifiedItem = try docSnapshot?.data(as: Item.self) {
let index = self.items.firstIndex(of: modifiedItem) {
self.items[index] = modifiedItem
}
case .removed:
if let removeItem = try docSnapshot?.data(as: Item.self) {
// 2 Things to check
// 1. Was the item deleted? If yes, then remove the item from the item array
// 2. If the item doesn't match the query anymore - check if it is just because of the limit which was set - If the limit was surpassed then keep item in array
self.questionItems.remove(object: newItem)
}
}
self.sortItemsByDate()
print("Count of items: \(self.questionItems.count)")
}
self.applySnapshot(items: items, animated: true)
})
}
Сначала я получаю начальную партию элементов, которые хочу отобразить (20). Затем я добавляю прослушиватель снимков, который должен добавлять, обновлять или удалять элементы в исходный массив. Первоначально будет 5 дубликатов, потому что я вызов слушателя после того, как я уже получил первые 20 элементов. Поэтому я проверяю .add, существует ли элемент уже, и добавляю его в массив, только если он не существует. Для модификаций .modified я просто обновляю соответствующий элемент. теперь сложная часть. Когда элемент удаляется, это может быть из-за 1. удаления или 2. он больше не соответствует запросу. Если элементы удаляются, я хочу удалить его из своего массива. Однако, если он был удален, потому что он больше не соответствует запросу, а точнее, потому, что превзошел предел 5, я хочу оставить его, а не удалять. Вот пример чисел.
Исходный массив элементов заполняется элементами с 1 по 20 [1 ... 20]. Затем я вызываю слушателя, чтобы проверить наличие обновлений, которые могут произойти. Это снова получает первые 5 элементов [1 ... 5]. Через свой лог c я просто пропускаю пункты, так как они уже есть. Проблема в том, что теперь добавляется новый элемент. Слушатель берет его и добавляет в массив, но также говорит мне удалить один элемент по достижении предела в 5. Я не могу различить guish между удалением (элемент действительно был удален из хранилища огня) и удалением (больше не соответствует запросу). Я использую FirebaseCore, ~> 6.6.0