取回的文档将取代之前在tableview中加载的文档。

问题描述 投票:0回答:1

我在swift iOS中使用下面的代码从firestore数据库中获取数据。但是当我滚动时,新加载的数据正在替换之前加载的数据在tableview中。我正在尝试解决这个问题,但截至目前没有好的办法。

要求的结果是,在tableview中向之前的文档列表中添加新的文档。

以下是我正在实现的代码。如果需要更多信息,请告诉我。

代码

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()
            }
        }
    }
ios swift uitableview google-cloud-firestore pagination
1个回答
1
投票

与其调用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
      }
  }
© www.soinside.com 2019 - 2024. All rights reserved.