我正在尝试在 swift iOS 中实现分页,它使用基于类别的过滤器和 Firestore 作为后端。但这只是在向下滚动时按照第一个查询加载到 5 个文档,并且它没有加载更多文档,因为它应该在分页中发生。
此方法中使用的查询基于 Category 类型 Filter,Filter 的类型是获取所有文档或基于所选类别。当我使用过滤查询时,根据以下示例中的第二个查询仅加载两个文档
在 stopObserving() 函数中,它应该删除侦听器。但是当查询被过滤,然后当过滤被删除时,它不会加载回未过滤的查询。
我只是无法分块加载数据。如果需要更多详细信息,请告诉我
问题的新补充
使用下面的代码,当应用过滤器时,查询中有whereField()子句,当过滤器被删除时,同样的子句也会从查询中删除,并且没有whereField()子句在查询分页中成功发生,否则没有与whereField 的分页查询中的()子句
我还希望使用whereField()子句进行分页,因为它发生在没有whereField()子句的情况下
代码
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()
}
}
基本查询
fileprivate func baseQuery() -> Query {
return Firestore.firestore().collection("collections").order(by: "timestamp", descending: true)
}
在这种情况下的问题是您试图按属性排序并where
在不同的属性上执行带有“等于”条件的子句。
如果要执行此类操作,则必须为这两个属性创建复合索引。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句