Swift Firestore 分页正在检索下一批文档但正在替换第一批

Swift Firestore pagination is retrieving the next batch of documents but replacing the first batch

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

我认为问题出在此处对 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 而不是每次都替换它的地方。