queryStarting (atValue не работает, как задумано? - PullRequest
0 голосов
/ 29 мая 2019

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

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

Давайте рассмотрим структуру сообщений

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...