首页 > 解决方案 > Swift Firestore 分页正在检索下一批文档但替换第一批

问题描述

在 Swift 中,我正在尝试实现分页,并且我能够检索下一批文档,但是,将它们加载到 UITableView 的底部,它正在替换第一批。我不确定我做错了什么。任何帮助是极大的赞赏。这是我的代码:

private var currentKey: String?

func fetchGlimpseData() {
    if currentKey == nil {
        GLIMPSE_ALL_USERS_DATA.order(by: TIMESTAMP, descending: true).limit(to: 3)
            .getDocuments { (snapshot, error) in
            
            guard let last = snapshot?.documents.last else { return }
            guard let allObjects = snapshot?.documents else { return }
            
            allObjects.forEach( { document in
                self.glimpse.removeAll()
                self.glimpse = Glimpse.parseData(snapshot: snapshot)
                self.glimpseTableView.reloadData()
            })
            self.currentKey = last.documentID
        }
    } else if currentKey != nil {
        GLIMPSE_ALL_USERS_DATA.order(by: TIMESTAMP, descending: true).limit(to: 3).getDocuments { (snapshot, error) in
            
            guard let lastDoc = snapshot?.documents.last else { return }
            
            if snapshot?.isEmpty == false {
                GLIMPSE_ALL_USERS_DATA.order(by: TIMESTAMP, descending: true).start(afterDocument: lastDoc).getDocuments { ( snapshot, error) in
                    guard let snap = snapshot?.documents else { return }
                    snap.forEach( { document in
                        self.glimpse = Glimpse.parseData(snapshot: snapshot)
                    })
                }
            }
            self.glimpseTableView.reloadData()
        }
    }
}


func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    let currentOffset = scrollView.contentOffset.y
    let maxOffset = scrollView.contentSize.height - scrollView.frame.size.height
    
    if maxOffset - currentOffset <= 40 {
        fetchGlimpseData()
    }
}

标签: swiftuitableviewgoogle-cloud-firestorepagination

解决方案


我认为问题来自对self.glimpse.removeAll()这里的调用:

GLIMPSE_ALL_USERS_DATA.order(by: TIMESTAMP, descending: true).limit(to: 3)
    .getDocuments { (snapshot, error) in
    
    guard let last = snapshot?.documents.last else { return }
    guard let allObjects = snapshot?.documents else { return }
    
    allObjects.forEach( { document in
        self.glimpse.removeAll()
        self.glimpse = Glimpse.parseData(snapshot: snapshot)
        ...

由于您首先从 中删除所有数据self.glimpse,因此在添加新数据后会删除上一页数据。

要保留两个页面,请不要调用self.glimpse.removeAll().


正如您在评论中指出的那样,您的第二页由 else 块加载-因此上述内容不会导致该问题。

在 else 块中,您还可以self.glimpse在此行中用每个快照替换现有值:

self.glimpse = Glimpse.parseData(snapshot: snapshot)

所以:self.glimpse该行之前的任何值,都会在该行运行后消失。

我希望看到你添加的东西Glimpse.parseData(snapshot: snapshot)self.glimpse不是每次都替换它。


推荐阅读