我正在尝试在快速的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)
}
答案 0 :(得分:0)
这种情况下的问题是,您试图按属性排序并在另一个属性上执行带有“等于”条件的where
子句。
如果要执行这种操作,则必须为两个属性都创建一个composite index。