QueryStarting(atValue не работает должным образом?

Мне интересно, как я могу использовать запросы упорядочения 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

Почему это? я проверил БД на начальную точку, которую я дал, и она существует

Кажется, вам не хватает одной из необходимых функций для выполнения запроса; queryOrdered(by как показано в документации Firebase Сортировка и фильтрация данных'

Jay 29.05.2019 20:20

Где сказано, что это обязательный метод? Я запрашивал в течение долгого времени, никогда не используя это. @Джей

user11182249 29.05.2019 20:43

Firebase необходимо знать, к какому дочернему элементу вы обращаетесь. В документации состояние Чтобы получить отсортированные данные, начните с указания один из методов Сортировать по для определения порядка упорядочения результатов:. Код немного сложно расшифровать, но похоже, что ваш путь — /Timeline/some_uid, но queryStarting:at начинается с KVDB2sNMgUN90tpkmQKfjrroOmt1:post:580367065. Немного неясно, что вы пытаетесь там сделать - в любом случае, ему нужно знать, на какой узел вы пытаетесь ссылаться; это может быть ключ с .queryOrderedByKey или значение с queryOrderedByValue

Jay 29.05.2019 20:59

* обратите внимание, что его можно опустить, если вы используете естественный порядок ключей, но тогда я не верю, что вы можете определить отправную точку. т. е. если есть 100 сообщений, вы можете вернуть последние 3 (самые последние) с помощью .queryLimited(toLast: 3)

Jay 29.05.2019 21:01

Хорошо @Jay, учитывая это, я думаю, что не знаю, как работает queryStarting:at. Я пытаюсь заставить работать разбиение на страницы, и поэтому я подумал, что смогу заставить его работать, когда пользователь добирается до последней ячейки, извлекая сообщения из последнего postRef в следующие 10+. Не работает queryStarting:at, позволяя мне указать по существу => [начиная с индекса этой строки, получить следующие 10]

user11182249 29.05.2019 21:21

Что ж, Firebase не имеет встроенного индекса, поэтому вам нужно знать, как упорядочить данные, а затем с чего начать загрузку данных. Вы можете сделать это по ключу ваших узлов или по значению дочернего элемента внутри узла. Взгляните на мой ответ и посмотрите, проясняет ли он это. Это сложно; предположим, у вас есть сообщения, за которые можно проголосовать, и вы хотите отобразить их по 10 за раз в порядке голосования. Это отличный вариант использования orderBy: number_of_votes и limitTo(10). Поскольку сообщения могут появляться в базе данных в любом порядке, и вы хотите, чтобы они возвращались по количеству голосов, поэтому «ключевой» порядок не будет работать.

Jay 29.05.2019 21:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не совсем понимаю запрос в вопросе, поэтому давайте посмотрим, сможем ли мы дать ответ на примере.

Возьмем структуру постов

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

Другие вопросы по теме