Я не полностью понимаю вопрос в вопросе, поэтому давайте посмотрим, сможем ли мы дать ответ на примере.
Давайте рассмотрим структуру сообщений
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») нового набора, каким он был уже в предыдущем наборе.