SwiftUI Firestore查询游标分页不起作用 [英] SwiftUI Firestore query cursors pagination not working

查看:74
本文介绍了SwiftUI Firestore查询游标分页不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to implement pagination in my app. when the app loads I want to load first item lets say. then every time he clicks refresh a new item is loaded. I have implemented this logic in my viewmodel.

第一次在我的SceneDelegate中调用 homeViewModel.load()

First time homeViewModel.load() is called in my SceneDelegate

let homeViewModel = HomeViewModel()
homeViewModel.refresh()

然后,每次用户想要获取新日期时,我都会调用 homeViewModel.refresh()

Then every time users wants to get new dates I call homeViewModel.refresh()

问题是,当应用程序加载时,我没有得到任何结果,而当我单击刷新时,我不断地重复获取表中的第二个文档.

The problem is that when the app loads I do not get any results and when I hit refresh I keep getting the second document in the table over and over again.

我在做什么错了?

我的HomeViewModel:

My 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)
            }
        }
    }
}

推荐答案

这是您的刷新功能

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)
        }
    }
}

该函数中没有任何东西可以使光标进一步前进,因此它将一遍又一遍地读取相同的数据.

There's nothing in that function that advances the cursor further so it will read the same data over and over.

如果您想读取下一组数据,则每次刷新后都需要将光标移动到最后一个文档,像这样

If you want to read the next set of data, the curser need to be moved to the last document after each refresh, like this

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)
        }
    }
}

这篇关于SwiftUI Firestore查询游标分页不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆