无法对基于Firestore过滤器的查询进行分页

时间:2020-05-18 04:26:36

标签: swift firebase google-cloud-firestore pagination

我正在尝试在快速的iOS中实现分页,该iOS使用基于类别的过滤器以及Firestore作为后端。 但这只会在第一个查询中最多加载5个文档,同时向下滚动,并且它不会加载更多文档,因为它应该在分页中发生。

此方法中使用的查询基于类别类型“筛选器”,筛选器的类型为获取所有文档或基于所选的类别。在下面的示例中,当我使用过滤查询时,根据第二个查询,仅会加载两个文档

在stopObserving()函数中,应该删除监听器。但是当查询被过滤后再被删除时,它不会重新加载未过滤的查询。

我只是无法大块加载数据。如果需要更多详细信息,请告诉我

新添加的问题

使用以下代码,当应用过滤器时,查询中存在 whereField()子句,而当删除过滤器时,也会从查询中删除同一子句,并且没有 whereField() 子句在查询中的分页成功发生,否则不会与查询中的 whereField()子句进行分页

我也希望使用 whereField()子句进行分页,因为它没有 whereField()子句

CODE

fileprivate func observeQuery() {

  fetchingMore = true
  guard var query = query else { return }
  stopObserving()

  if posts.isEmpty {
    query = query.limit(to: 5)

    print("First 6 rides loaded")
  } else {
    query = query.start(afterDocument: lastDocumentSnapshot).limit(to: 2)
  }

  listener = query.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
      }
    }
    self.posts = models
    DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
      self.tableView.reloadData()
      self.fetchingMore = false
    })

    self.lastDocumentSnapshot = snapshot.documents.last

    self.documents = snapshot.documents

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

  }
}

whereField()查询的代码,该查询将更新BaseQuery,然后在observeQuery()中调用该查询以获取文档并对其进行分页

extension HomeViewController: FiltersViewControllerDelegate {

  func query(withCategory category: String?) -> Query {
    var filtered = baseQuery()

    if category == nil {
      stackViewHeightConstraint.constant = 0
      activeFiltersStackView.isHidden = true
    } else {
      stackViewHeightConstraint.constant = 44
      activeFiltersStackView.isHidden = false
    }

    // Advanced queries

    if let category = category, !category.isEmpty {
      filtered = filtered.whereField("category", isEqualTo: category)
    }

    return filtered
  }

  func controller(_ controller: FiltersViewController,
                  didSelectCategory category: String?
                  ) {
    let filtered = query(withCategory: category)

    if let category = category, !category.isEmpty {
      categoryFilterLabel.text = category
      categoryFilterLabel.isHidden = false
    } else {
      categoryFilterLabel.isHidden = true
    }

    self.query = filtered
    observeQuery()
  }

}

BaseQuery

fileprivate func baseQuery() -> Query {
  return Firestore.firestore().collection("collections").order(by: "timestamp", descending: true)
}

1 个答案:

答案 0 :(得分:0)

这种情况下的问题是,您试图按属性排序并在另一个属性上执行带有“等于”条件的where子句。

如果要执行这种操作,则必须为两个属性都创建一个composite index