【发布时间】:2019-12-29 13:08:19
【问题描述】:
我在这个问题的底部使用了分页方法,效果很好。一旦 startKey 使用来自 db 的 key 初始化,这就是下一个分页发生的点,并且下一组帖子(子)将被附加到数据源。
我意识到,如果 key 被最初发布它的用户删除,那么一旦我尝试从该 key 分页,因为它不存在,如果它存在就会被附加的孩子不会' t 被附加,因为它们不可访问(可根据该键访问它们)。
我唯一能想到的就是首先检查密钥 exists() 是否从头开始:
if !snapshot.exists() {
self?.startKey = nil
self?.datasource.removeAll()
self?.collectionView.reloadData()
self?.handlePagination()
return
}
它工作正常,但它不是最流畅的用户体验,因为我宁愿在删除键之前拉出帖子(我没有事先参考它们)。
一种可能性是只保留所有先前键的数组并循环遍历它们,但这些键总是有可能被发布它们的用户删除。
对如何解决这个问题有任何想法吗?
var startKey: String?
func handlePagination() {
if startKey == nil {
Database...Ref.child("posts")
.queryOrderedByKey()
.queryLimited(toLast: 7)
.observeSingleEvent(of: .value, with: { [weak self](snapshot) in
guard let children = snapshot.children.allObjects.first as? DataSnapshot else { return}
for child in snapshot.children.allObjects as! [DataSnapshot] {
// append child to datasource
}
self?.startKey = children.key
})
} else {
Database...Ref.child("posts")
.queryOrderedByKey()
.queryEnding(atValue: startKey!)
.queryLimited(toLast: 8)
.observeSingleEvent(of: .value, with: { [weak self](snapshot) in
if !snapshot.exists() {
self?.startKey = nil
self?.datasource.removeAll()
self?.collectionView.reloadData()
self?.handlePagination()
return
}
guard let children = snapshot.children.allObjects.first as? DataSnapshot else { return}
for child in snapshot.children.allObjects as! [DataSnapshot] {
// insert child in datasource at startIndex
}
self?.startKey = children.key
})
}
}
【问题讨论】:
-
“这些密钥总是有可能被发布它们的用户删除”在这种情况下,您最终会显示(新的)第一个结果。对于这种(不太可能的)情况,这似乎是正确的行为,不是吗?
-
Lmao,我知道这是一个非常非常非常非常不可能的情况,所有密钥都会被删除,但它确实有发生的可能性很小(如果所有这些用户都删除了我拥有的所有帖子要担心更大的问题)。也许是我想太多了????。 “在那种情况下,你最终会首先显示新结果”是什么意思?你用那个弄丢了我
-
您是说您可以保留当前页面的键,然后循环遍历直到找到未删除的项目。如果所有内容都已删除,您将到达键列表的末尾,并且应该创建一个没有
startAt()的新查询。这将为您提供前 X 项,我认为在这种情况下这是正确的行为。 -
一般来说:处理实时和分页真的很难,这是 FirebaseUI 中的分页适配器不进行实时更新的主要原因。
-
啊,好的。从字面上看,我上周刚开始学习分页,在这个过程中,我看到有很多不同的情况会发生,甚至有很多不同的场景来设置分页,我不确定我是否做错了。你只是给了我一些保证,不只是我。我肯定看到了困难。老实说,如果不存在,最简单的意外情况就是从头开始。说你说的话,我只是要保持简单。如果应用程序增长,我稍后会担心所有其他事情。像往常一样谢谢????
标签: ios swift firebase-realtime-database pagination