gpt4 book ai didi

ios - Firestore分页数据+快照监听器

转载 作者:行者123 更新时间:2023-12-02 03:54:13 28 4
gpt4 key购买 nike

我现在正在使用 Firestore,但在分页方面遇到了一些问题。
基本上,我有一个集合(假设 10 个项目),其中每个项目都有一些数据和时间戳。

现在,我正在获取前 3 个项目,如下所示:

Firestore.firestore()
.collection("collectionPath")
.order(by: "timestamp", descending: true)
.limit(to: 3)
.addSnapshotListener(snapshotListener())

在我的快照监听器中,我保存快照中的最后一个文档,以便将其用作下一页的起点。

因此,有时我会请求下一页的项目,如下所示:

Firestore.firestore()
.collection("collectionPath")
.order(by: "timestamp", descending: true)
.start(afterDocument: lastDocument)
.limit(to: 3)
.addSnapshotListener(snapshotListener2()) // Note that this is a new snapshot listener, I don't know how I could reuse the first one

现在我的前端中有从索引 0 到索引 5 的项目(总共 6 个)。整洁!

如果索引 4 处的文档现在将其时间戳更新为整个集合的最新时间戳,则情况开始恶化。
请记住,时间戳根据 order 子句确定其位置!

我期望发生的是,应用更改后,我仍然显示 6 个项目(并且仍然按时间戳排序)

发生的情况是,应用更改后,我只剩下 5 个项目,因为从第一个快照中推出的项目不会自动添加到第二个快照中。

我是否遗漏了有关 Firestore 分页的信息?

编辑:根据要求,我在这里发布了更多代码:
这是我返回快照监听器的函数。好吧,我用两种方法请求第一页,然后请求第二页,我已经在上面发布了

private func snapshotListener() -> FIRQuerySnapshotBlock {
let index = self.index
return { querySnapshot, error in
guard let snap = querySnapshot, error == nil else {
log.error(error)
return
}

// Save the last doc, so we can later use pagination to retrieve further chats
if snap.count == self.limit {
self.lastDoc = snap.documents.last
} else {
self.lastDoc = nil
}

let offset = index * self.limit

snap.documentChanges.forEach() { diff in
switch diff.type {
case .added:
log.debug("added chat at index: \(diff.newIndex), offset: \(offset)")
self.tVHandler.dataManager.insert(item: Chat(dictionary: diff.document.data() as NSDictionary), at: IndexPath(row: Int(diff.newIndex) + offset, section: 0), in: nil)

case .removed:
log.debug("deleted chat at index: \(diff.oldIndex), offset: \(offset)")
self.tVHandler.dataManager.remove(itemAt: IndexPath(row: Int(diff.oldIndex) + offset, section: 0), in: nil)

case .modified:
if diff.oldIndex == diff.newIndex {
log.debug("updated chat at index: \(diff.oldIndex), offset: \(offset)")
self.tVHandler.dataManager.update(item: Chat(dictionary: diff.document.data() as NSDictionary), at: IndexPath(row: Int(diff.oldIndex) + offset, section: 0), in: nil)
} else {
log.debug("moved chat at index: \(diff.oldIndex), offset: \(offset) to index: \(diff.newIndex), offset: \(offset)")
self.tVHandler.dataManager.move(item: Chat(dictionary: diff.document.data() as NSDictionary), from: IndexPath(row: Int(diff.oldIndex) + offset, section: 0), to: IndexPath(row: Int(diff.newIndex) + offset, section: 0), in: nil)
}
}
}
self.tableView?.reloadData()
}
}

我再次询问是否可以有一个快照监听器来监听我从 Firestore 请求的多个页面中的更改

最佳答案

嗯,我联系了 Firebase Google Group 的人员寻求帮助,他们告诉我,我的用例尚不受支持。
感谢 Kato Richardson 解决我的问题!

对于任何对详细信息感兴趣的人,请参阅此 thread

关于ios - Firestore分页数据+快照监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51716423/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com