我现在正在与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)解决我的问题!
对于对细节感兴趣的任何人,请参见此主题