【问题标题】:Firebase -How to handle pagination if the key set to paginate from has been deletedFirebase - 如果设置为分页的键已被删除,如何处理分页
【发布时间】:2019-12-29 13:08:19
【问题描述】:

我在这个问题的底部使用了分页方法,效果很好。一旦 startKey 使用来自 dbkey 初始化,这就是下一个分页发生的点,并且下一组帖子(子)将被附加到数据源。

我意识到,如果 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


【解决方案1】:

这些密钥总是有可能被发布它们的用户删除

您是说您可以保留当前页面的键,然后循环遍历直到找到未删除的项目。在所有都被删除的情况下,您将到达键列表的末尾,并且应该创建一个没有 startAt() 的新查询。这将为您提供前 X 项,我认为在这种情况下这是正确的行为。

但总的来说:处理实时和分页非常困难,这是 FirebaseUI 中的分页适配器不进行实时更新的主要原因。

【讨论】:

    猜你喜欢
    • 2019-07-11
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2021-02-06
    • 2013-07-14
    相关资源
    最近更新 更多