Полученные документы заменяют ранее загруженные документы в табличном представлении. - PullRequest
0 голосов
/ 04 мая 2020

Я использую приведенный ниже код для извлечения данных из базы данных firestore в swift iOS. Но когда я прокручиваю, новые загруженные данные заменяют ранее загруженные данные в виде таблицы. Я пытаюсь решить эту проблему, но на данный момент ничего не получается.

Требуемый результат состоит в том, что добавление новых документов к ранее списку документов в табличном представлении

Ниже приведен код, который я реализую , Если требуется дополнительная информация, пожалуйста, дайте мне знать

КОД

fileprivate func observeQuery() {
        fetchMoreIngredients = true

        //guard let query = query else { return }
        var query1 = query
        stopObserving()
        if posts.isEmpty{
            query1 = Firestore.firestore().collection("posts").order(by: "timestamp", descending: true).limit(to: 5)
        }
        else {
            query1 = Firestore.firestore().collection("posts").order(by: "timestamp", descending: true).start(afterDocument: lastDocumentSnapshot).limit(to: 2)
            //  query = db.collection("rides").order(by: "price").start(afterDocument: lastDocumentSnapshot).limit(to: 4)
            print("Next 4 rides loaded")
            print("hello")
        }
        // Display data from Firestore, part one

        listener = query1!.addSnapshotListener { [unowned self] (snapshot, error) in
            guard let snapshot = snapshot else {
                print("Error fetching snapshot results: \(error!)")
                return
            }
            let models = snapshot.documents.map { (document) -> Post in
                if let model = Post(dictionary: document.data()) {
                    return model
                } else {
                    // Don't use fatalError here in a real app.
                    fatalError("Unable to initialize type \(Post.self) with dictionary \(document.data())")
                }
            }

            self.posts = models
            self.documents = snapshot.documents

            if self.documents.count > 0 {
                self.tableView.backgroundView = nil
            } else {
                self.tableView.backgroundView = self.backgroundView
            }

            self.tableView.reloadData()
            self.fetchMoreIngredients = false
            self.lastDocumentSnapshot = snapshot.documents.last

        }
    }

func scrollViewDidScroll(_ scrollView: UIScrollView) {

        let off = scrollView.contentOffset.y
        let off1 = scrollView.contentSize.height

        if off > off1 - scrollView.frame.height * leadingScreensForBatching{
            if !fetchMoreIngredients && !reachEnd{
                print(fetchMoreIngredients)
              //  beginBatchFetch()
                // query = baseQuery()
                observeQuery()
            }
        }
    }

1 Ответ

2 голосов
/ 04 мая 2020

Вместо вызова snapshot.documents, вызовите snapshot.documentChanges. Это возвращает список изменений документа (.added, .modified или .removed) и позволяет вам добавлять, удалять или изменять их в своем локальном массиве по мере необходимости ... Не проверенный код - просто идея, что вы можете сделать. ..

snapshot.documentChanges.forEach() { diff in
      switch diff.type {
      case .added:



          if let model = Post(dictionary: diff.document.data()){
            self.posts.append(model)
        }else {
            // Don't use fatalError here in a real app.
            fatalError("Unable to initialize type \(Post.self) with dictionary \(document.data())")
        }
      case .removed:
       // add remove case

      case .modified:
          // add modify case
      }
  }
...