Различие guish между удаленным или удаленным в FIRDocumentChangeType - PullRequest
0 голосов
/ 13 июля 2020

Моя основная цель - совместить нумерацию страниц в 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

1 Ответ

1 голос
/ 13 июля 2020

Похоже, вы пытаетесь различить guish между этими двумя случаями в вашем .removed обработчике:

  1. Документ выпал из результатов запроса, но все еще существует в базе данных.
  2. Документ был удален из базы данных, а значит, и из результатов запроса.

Я не думаю, что в * 1010 передаются какие-либо метаданные * / QueryDocumentSnapshot, чтобы различать guish между этими двумя случаями. Единственное, что я могу придумать, - это попытаться загрузить документ, но это будет довольно дорогостоящая операция.

...