Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SwiftUI Firestore查询游标分页不工作_Ios_Swift_Firebase_Google Cloud Firestore_Swiftui - Fatal编程技术网

Ios SwiftUI Firestore查询游标分页不工作

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() 问题是,当应用程序加载时,我没有得到任何

我正在尝试在我的应用程序中实现分页。当应用程序加载时,我想加载第一项。然后,每次单击“刷新”时,都会加载一个新项目。 我已经在viewmodel中实现了这个逻辑

第一次在我的SceneDelegate中调用
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开始,这将是加载函数中读取的文档之后的文档。我根据您的其他问题对其进行了修改,并且工作正常!谢谢