【问题标题】:Swift Firestore pagination is retrieving the next batch of documents but replacing the first batchSwift Firestore 分页正在检索下一批文档但替换第一批
【发布时间】:2021-11-16 03:26:17
【问题描述】:

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

【问题讨论】:

    标签: swift uitableview google-cloud-firestore pagination


    【解决方案1】:

    我认为问题出在此处对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()


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

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

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

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

    我希望看到您将Glimpse.parseData(snapshot: snapshot)添加self.glimpse,而不是每次都替换它。

    【讨论】:

    • 感谢您的评论,弗兰克。在第二次调用中 self.glimpse.removeAll() 应该没有问题,此时 currentkey 不是 nil 并且“else”块是被调用的。
    • 哎呀...我在脑海中颠倒了条件。 else 块也用每个快照替换了 self.glimpse 的现有值:self.glimpse = Glimpse.parseData(snapshot: snapshot)。我希望看到您将Glimpse.parseData(snapshot: snapshot)添加self.glimpse,而不是每次都替换它。
    • 明白了,有道理,我必须将新文档附加到 self.glimpse。我现在唯一的问题是它加载了下一批文档,但是,当我到达底部时,它一遍又一遍地加载相同的最后 3 个。
    • 是的,您可能希望在您目前加载的最后一个文档中添加一个 startAfter 调用,以摆脱它。
    猜你喜欢
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2016-01-26
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多