user13410550
user13410550

Reputation:

Documents fetched are replacing the previous loaded documents in tableview

I am using the below code to fetch the data from the firestore database in swift iOS. But when I scroll the new data loaded is replacing the previously loaded data in the tableview. I am trying to fix this issue but as of now no good.

The outcome required is that adding new documents to the previously list of documents in the tableview

Below is the code I am implementing. If any more information is required please let me know

CODE

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()
            }
        }
    }

Upvotes: 0

Views: 62

Answers (1)

Jawad Ali
Jawad Ali

Reputation: 14397

Instead of calling snapshot.documents, call snapshot.documentChanges. This returns a list of document changes (either .added, .modified, or .removed, and allows you to add, remove, or modify them in your local array as needed... Not tested code just an idea what you ca do ...

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
      }
  }

Upvotes: 1

Related Questions