我想知道如何使用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
这是为什么?我检查了数据库中给出的起点,它确实存在
答案 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”)丢弃已经在先前的集合中。