Ios SwiftUI Firestore查询游标分页不工作
我正在尝试在我的应用程序中实现分页。当应用程序加载时,我想加载第一项。然后,每次单击“刷新”时,都会加载一个新项目。 我已经在viewmodel中实现了这个逻辑 第一次在我的SceneDelegate中调用Ios SwiftUI Firestore查询游标分页不工作,ios,swift,firebase,google-cloud-firestore,swiftui,Ios,Swift,Firebase,Google Cloud Firestore,Swiftui,我正在尝试在我的应用程序中实现分页。当应用程序加载时,我想加载第一项。然后,每次单击“刷新”时,都会加载一个新项目。 我已经在viewmodel中实现了这个逻辑 第一次在我的SceneDelegate中调用homeViewModel.load() let homeViewModel = HomeViewModel() homeViewModel.refresh() 然后,每当用户想要获取新日期时,我都会调用homeViewModel.refresh() 问题是,当应用程序加载时,我没有得到任何
homeViewModel.load()
let homeViewModel = HomeViewModel()
homeViewModel.refresh()
然后,每当用户想要获取新日期时,我都会调用homeViewModel.refresh()
问题是,当应用程序加载时,我没有得到任何结果,而当我点击“刷新”时,我会一次又一次地得到表中的第二个文档
我做错了什么
我的HomeViewModel:
class HomeViewModel: ObservableObject, LoadProtocol {
var firestoreService: FirestoreService = FirestoreService()
@Published var items: [Item] = []
let db = Firestore.firestore()
var first: Query = Firestore.firestore().collection("items").limit(to: 1)
load() {
self.first.addSnapshotListener { (snapshot, error) in
guard let snapshot = snapshot else {
print("Error retrieving cities: \(error.debugDescription)")
return
}
guard let lastSnapshot = snapshot.documents.last else {
// The collection is empty.
return
}
// Construct a new query starting after this document,
// retrieving the next 25 cities.
let next = self.db.collection("items")
.start(afterDocument: lastSnapshot).limit(to: 1)
self.first = next
// Use the query for pagination.
}
}
func refresh() {
self.firestoreService.fetchCollection(query: self.first) { (result: Result<[Item], Error>) in
switch result {
case .success(let items):
self.items += items
self.addToCategories()
case .failure(let error):
print(error)
}
}
}
}
class HomeViewModel:ObservableObject,LoadProtocol{
var firestoreService:firestoreService=firestoreService()
@已发布的变量项:[Item]=[]
设db=Firestore.Firestore()
var first:Query=Firestore.Firestore().collection(“items”).limit(到:1)
加载(){
self.first.addSnapshotListener{(快照,错误)位于
guard let snapshot=snapshot else{
打印(“检索城市时出错:\(Error.debugDescription)”)
返回
}
guard let lastSnapshot=snapshot.documents.last else{
//集合为空。
返回
}
//从该文档之后开始构造新查询,
//检索接下来的25个城市。
let next=self.db.collection(“项”)
.start(afterDocument:lastsnashot).限制(到:1)
self.first=下一个
//使用查询进行分页。
}
}
func刷新(){
中的self.firestoreService.fetchCollection(查询:self.first){(结果:result)
切换结果{
成功案例(让项目):
self.items+=项目
self.addToCategories()
案例。失败(let错误):
打印(错误)
}
}
}
}
这是您的刷新功能
func refresh() {
self.firestoreService.fetchCollection(query: self.first) { (result: Result<[Item], Error>) in
switch result {
case .success(let items):
self.items += items
self.addToCategories()
case .failure(let error):
print(error)
}
}
}
这是你的刷新功能
func refresh() {
self.firestoreService.fetchCollection(query: self.first) { (result: Result<[Item], Error>) in
switch result {
case .success(let items):
self.items += items
self.addToCategories()
case .failure(let error):
print(error)
}
}
}
嗯。这很可疑。
。限制(到:1)
这只是为了测试。可能是20岁,但我没有那么多数据。解决方案对你有用吗!?嗯。这很可疑。。限制(到:1)
这只是为了测试。可能是20岁,但我没有那么多数据。解决方案对你有用吗!?谢谢,那么我需要去掉加载函数吗?并且只使用refresh()
?@RexhinHoxha,因为它提供了一个起点。然而,我经常发现,在一个函数中完成所有操作是最容易维护的。请查看我的答案,因为它将所有内容汇总到一个函数中-看看这是否给了您一些想法。使用我在这里发布的内容同样适用于加载和刷新。这很好,所以我们的想法是区分第一个查询和其他查询。第一个不应该有.start(afterDocument:lastSnapshot)
对吗?最后一件事。addSnapshotListener还将侦听对这些文档所做的更改,对吗?在这种情况下,此.start(afterDocument:lastSnapshot)
实际上是正常的,因为它发生在读取所有第一组文档之后。它将刷新函数设置为从self.first开始,这将是加载函数中读取的文档之后的文档。我根据您的其他问题对其进行了修改,并且工作正常!谢谢,那么我需要去掉加载函数吗?并且只使用refresh()
?@RexhinHoxha,因为它提供了一个起点。然而,我经常发现,在一个函数中完成所有操作是最容易维护的。请查看我的答案,因为它将所有内容汇总到一个函数中-看看这是否给了您一些想法。使用我在这里发布的内容同样适用于加载和刷新。这很好,所以我们的想法是区分第一个查询和其他查询。第一个不应该有.start(afterDocument:lastSnapshot)
对吗?最后一件事。addSnapshotListener还将侦听对这些文档所做的更改,对吗?在这种情况下,此.start(afterDocument:lastSnapshot)
实际上是正常的,因为它发生在读取所有第一组文档之后。它将刷新函数设置为从self.first开始,这将是加载函数中读取的文档之后的文档。我根据您的其他问题对其进行了修改,并且工作正常!谢谢