queryStarting(atValue是否无法正常工作?

时间:2019-05-29 17:57:47

标签: ios swift firebase firebase-realtime-database

我想知道如何使用Firebase排序查询使分页在我的应用程序中起作用。

所以我尝试了以下方法:

    func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    if indexPath.row == postArray.count - 1 {
        //we are at last cell load more content
        //Do some logic here I think like
        limit += 10
         getRecentPosts(limit)
        //self.perform(#selector(reloadData), with: nil, afterDelay: 1.0)
    }
}

@objc func reloadData() {
    self.collectionView.reloadData()
}

并且:  我这样做是为了使其正常工作。但事实并非如此,我在下面对此进行扩展。

  ref.child("Timeline").child((Auth.auth().currentUser?.uid)!)
  .queryStarting(atValue: "\(postArray[postArray.count-1].user.userID!):\(postArray[postArray.count-1].media[0].postID!)")//here is a sample val: KVDB2sNMgUN90tpkmQKfjrroOmt1:post:580367065
  .queryLimited(toLast: UInt(limit)).observeSingleEvent(of: .value, with: { (snapshot) in

我的获取功能如下:

        } else {
        print("ffdsafsfsdfasdfsd?????", postArray.count)
        print("\(postArray[postArray.count-1].user.userID!):\(postArray[postArray.count-1].media[0].postID!)", "  fhdskagfakshgfjdshflkahflkjashlkjfhslkj")

        ref.child("Timeline").child((Auth.auth().currentUser?.uid)!)
            .queryStarting(atValue: "\(postArray[postArray.count-1].user.userID!):\(postArray[postArray.count-1].media[0].postID!)")
            .queryLimited(toLast: UInt(limit)).observeSingleEvent(of: .value, with: { (snapshot) in
                print("resulst here?????????")
                if let snapshots = snapshot.children.allObjects as? [DataSnapshot] {
                    print(snapshots, " this is the snapshot of the people you follow", snapshots.count)

                    for child in snapshots.reversed() {

                        let keyValue = child.key
                        let uid = keyValue.split(separator: ":")[0]
                        let postIDDoubleVal = keyValue.split(separator: ":")[2]


                        self.fetchUsersPost(uid: String(uid), postID: "post:\(postIDDoubleVal)")
                    }
                }
            })
    }
}

更新:

我发现该逻辑可以根据需要工作,但可以在我打印的地方使用:

                    if let snapshots = snapshot.children.allObjects as? [DataSnapshot] {
                    print(snapshots, " this is the snapshot of the people you follow", snapshots.count)

我得到以下输出:

[]  this is the snapshot of the people you follow 0

这是为什么?我检查了数据库中给出的起点,它确实存在

1 个答案:

答案 0 :(得分:0)

我不完全理解问题中的查询,因此让我们看看是否可以通过示例产生答案。

让我们看一下帖子的结构

Timeline
   uid_0
      post_0: "a"
      post_1: "b"
      post_2: "c"
      post_3: "d"
      post_4: "e"
      post_5: "f"
      post_6: "g"
      post_7: "h"
      post_8: "i"
      post_9: "j"

可以采用多种方式分页,但让我们使用两个简单的示例。

在第一个示例中,假设我们想要从post_3开始的三个帖子,所以我们想要d,e和f,我们知道以post_3开头的实际键。

func paginationByKey() {
    let ref = self.ref.child("Timeline").child("uid_0")
    let q0 = ref.queryOrderedByKey() //they will be ordered by key
    let q1 = q0.queryStarting(atValue: "post_3").queryLimited(toFirst: 3)
    q1.observeSingleEvent(of: .value, with: { snapshot in
        print(snapshot)
    })
}

这将返回

Snap (uid_0) {
    "post_3" = d;
    "post_4" = e;
    "post_5" = f;
}

在第二个示例中,在许多情况下,节点密钥是通过push()或.childByAutoId生成的,因此您不会知道密钥。但是,您会知道起始值,例如日期或时间戳。而且,数据实际上可以以任何顺序存储在数据库中。为了处理这一点,我们知道要读取的第一个值是“ d”,然后是“ e”和“ f”

func paginationByValue() {
    let ref = self.ref.child("Timeline").child("uid_0")
    let q0 = ref.queryOrderedByValue() //ordering the data by child value
    let q1 = q0.queryStarting(atValue: "d").queryLimited(toFirst: 3)
    q1.observeSingleEvent(of: .value, with: { snapshot in
        print(snapshot)
    })
}

输出为

Snap (uid_0) {
    "post_3" = d;
    "post_4" = e;
    "post_5" = f;
}

要进行分页,由于您知道最后加载的节点的值为'f',因此下一组数据将以'g'开头。有两种处理方法:

一种方法是实际加载4个节点并显示3。第4个节点是下一组数据的起点,因此您可以将其保留在类var中以供参考。

另一种选择是在刚加载的节点集中的最后一个节点(在这种情况下为“ f”)处开始查询,但将新集合中的第一个(即为“ f”)丢弃已经在先前的集合中。