Мне интересно, как я могу использовать запросы упорядочения 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
Почему это? я проверил БД на начальную точку, которую я дал, и она существует
Где сказано, что это обязательный метод? Я запрашивал в течение долгого времени, никогда не используя это. @Джей
Firebase необходимо знать, к какому дочернему элементу вы обращаетесь. В документации состояние Чтобы получить отсортированные данные, начните с указания один из методов Сортировать по для определения порядка упорядочения результатов:. Код немного сложно расшифровать, но похоже, что ваш путь — /Timeline/some_uid, но queryStarting:at начинается с KVDB2sNMgUN90tpkmQKfjrroOmt1:post:580367065
. Немного неясно, что вы пытаетесь там сделать - в любом случае, ему нужно знать, на какой узел вы пытаетесь ссылаться; это может быть ключ с .queryOrderedByKey
или значение с queryOrderedByValue
* обратите внимание, что его можно опустить, если вы используете естественный порядок ключей, но тогда я не верю, что вы можете определить отправную точку. т. е. если есть 100 сообщений, вы можете вернуть последние 3 (самые последние) с помощью .queryLimited(toLast: 3)
Хорошо @Jay, учитывая это, я думаю, что не знаю, как работает queryStarting:at. Я пытаюсь заставить работать разбиение на страницы, и поэтому я подумал, что смогу заставить его работать, когда пользователь добирается до последней ячейки, извлекая сообщения из последнего postRef в следующие 10+. Не работает queryStarting:at, позволяя мне указать по существу => [начиная с индекса этой строки, получить следующие 10]
Что ж, Firebase не имеет встроенного индекса, поэтому вам нужно знать, как упорядочить данные, а затем с чего начать загрузку данных. Вы можете сделать это по ключу ваших узлов или по значению дочернего элемента внутри узла. Взгляните на мой ответ и посмотрите, проясняет ли он это. Это сложно; предположим, у вас есть сообщения, за которые можно проголосовать, и вы хотите отобразить их по 10 за раз в порядке голосования. Это отличный вариант использования orderBy: number_of_votes и limitTo(10). Поскольку сообщения могут появляться в базе данных в любом порядке, и вы хотите, чтобы они возвращались по количеству голосов, поэтому «ключевой» порядок не будет работать.
Я не совсем понимаю запрос в вопросе, поэтому давайте посмотрим, сможем ли мы дать ответ на примере.
Возьмем структуру постов
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-й узел является отправной точкой для следующего набора данных, поэтому вы, возможно, сохраните его в переменной класса для справки.
Другой вариант — начать запрос с последнего узла из только что загруженного набора узлов, в данном случае «f», но отбросить первый (который будет «f») нового набора, поскольку он уже был в предварительный набор.
Кажется, вам не хватает одной из необходимых функций для выполнения запроса;
queryOrdered(by
как показано в документации Firebase Сортировка и фильтрация данных'