SwiftUI Firestore 查询游标分页不起作用

Posted

技术标签:

【中文标题】SwiftUI Firestore 查询游标分页不起作用【英文标题】:SwiftUI Firestore query cursors pagination not working 【发布时间】:2020-04-30 18:33:35 【问题描述】:

我正在尝试在我的应用中实现分页。当应用程序加载时,我想加载第一项可以说。然后每次他单击刷新时都会加载一个新项目。 我已经在我的视图模型中实现了这个逻辑。

第一次在我的 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)
            
        
    

【问题讨论】:

嗯。这很可疑.limit(to: 1) 它只是用于测试。可能是 20,但我没有那么多数据 解决方案对您有用吗!? 【参考方案1】:

这是你的刷新功能

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.first.addSnapshotListener  (snapshot, error) in
        if let err = error 
            print(err.localizedDescription)
            return
        

        guard let snapshot = snapshot else  return 

        guard let lastSnapshot = snapshot.documents.last else  return 

        let next = self.db.collection("items").start(afterDocument: lastSnapshot).limit(to: 2)

        self.first = next

        for doc in snapshot.documents 
            print(doc.documentID)
        
    

【讨论】:

谢谢,那我需要去掉加载功能吗?并且只使用refresh()? @RexhinHoxha 不一定,因为它提供了一个起点。但是,我经常发现在一个函数中完成所有操作是最容易维护的。查看我对 this question 的回答,因为它将所有内容整合到一个函数中 - 看看这是否会给你一些想法。使用我在此处发布的内容同样适用于加载和刷新。 这很好,所以我们的想法是区分第一个查询和其余查询。第一个不应该有.start(afterDocument: lastSnapshot) 对吗?最后一件事。 addSnapshotListener 也会监听对这些文档所做的更改,对吗? 这个.start(afterDocument: lastSnapshot) 在这种情况下实际上是可以的,因为它是在读入所有第一组文档之后发生的。它将刷新函数设置为从 self.first 开始,这将是在加载函数中读取的文档之后的文档。 我根据您的其他问题对其进行了修改,并且工作正常!谢谢

以上是关于SwiftUI Firestore 查询游标分页不起作用的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI + Firestore - 基于从 Firestore 返回的数组的过滤器列表

PHP+MYSQL查询结果上加一个排名序号且分页不间断

SwiftUI Firebase Firestore 查询函数

fix bug:page-helper分页不正确

带有连接表字段排序的 Cakephp 分页不起作用

pagehelper 分页不生效,总页数总是1解决方案