es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

iOS Firebase Paginate por Fecha

Tengo una aplicación de notas. Normalmente pagino el nodo posts-userIds a continuación mediante childByAutoId, lo cual funciona bien. Permito a los usuarios realizar ediciones, momento en el cual actualizo todo y agrego una editDate al propio post. Pero esa editDate está en la referencia posts, no en la referencia posts-userIds.

¿Cómo puedo paginar la referencia posts-userIds por medio de editDate? El problema es que las editDates son opcionales, lo que significa que podrían hacer 200 publicaciones pero solo 2 ediciones o incluso ninguna. De cualquier manera, si el usuario desea ver las editDates primero, aún necesitan ver las postDates junto con ellas.

El orden sería en primer lugar las editDates y luego las postDates, o si no hay editDates, simplemente mostrar todas las postDates.

Estaba pensando en lugar de usar un 1 como valor, tal vez debería poner una postDate o editDate (si se realizó una) como el valor en la referencia posts-userIds, como en:

-postId-123: 1 // esto es lo que normalmente uso, no tiene significado, solo un 1 para que tenga un valor
-postId-123: reemplazar el 1 con la postDate y cambiar esto a editDate cuando realicen una edición

Quizás luego podría utilizar ref.queryOrderedByValue(), pero no estoy seguro.

Mi estructura es la siguiente:

@posts
  @postId-123 // childByAutoId
     -uid: "userId-ABC"
     -postDate: 1640898417.456389
     -editDate: 1640814049.713224 // la fecha de edición solo está presente si el usuario hizo una edición

@posts-userIds
    @userId-ABC
       -postId-123: 1

Pagino de la siguiente manera:

let ref = Database.database().reference().child("posts-userIds").child(Auth.auth().currentUser!.uid)

if startKey == nil  {

    ref.queryOrderedByKey()
        .queryLimited(toLast: 20)
        .observeSingleEvent(of: .value, with: { (snapshot) in

        // obtener las publicaciones y establecer startKey
    })

} else {

    ref.queryOrderedByKey()
        .queryEnding(atValue: startKey!)
        .queryLimited(toLast: 21)
        .observeSingleEvent(of: .value, with: { (snapshot) in
    })
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para paginar la referencia posts-userIds por editDate, un enfoque podría ser agregar el valor de editDate (si está disponible) como el valor de la referencia posts-userIds en lugar de un 1 sin sentido. Esto se puede hacer reemplazando el 1 con el valor de editDate cuando el usuario realiza una edición.

    Una vez que se agregan los valores de editDate a la referencia posts-userIds, puedes usar ref.queryOrderedByValue() para ordenar las publicaciones primero por editDate, seguido por postDate (si no hay valores de editDate). Esto te dará el orden deseado de las publicaciones.

    Tu nueva estructura para posts-userIds podría lucir así:

    @posts-userIds
       @userId-ABC
          -postId-123: 1640814049.713224 // valor de editDate (si está disponible)
          -postId-124: 1640898417.456389 // valor de postDate
          -postId-125: 1 // sin valor de fecha
          ...
    

    Y tu código de paginación actualizado podría verse así:

    let ref = Database.database().reference().child("posts-userIds").child(Auth.auth().currentUser!.uid)
    
    if startKey == nil {
    
        ref.queryOrderedByValue()
            .queryLimited(toLast: 20)
            .observeSingleEvent(of: .value, with: { (snapshot) in
                // obtener publicaciones y establecer startKey
            })
    
    } else {
        let endValue = startKey! == "1" ? 9999999999.999 : startKey! // si startKey es "1", usa el valor máximo posible como endValue
        ref.queryOrderedByValue()
            .queryEnding(atValue: endValue)
            .queryLimited(toLast: 21)
            .observeSingleEvent(of: .value, with: { (snapshot) in
                // obtener publicaciones y establecer startKey
            })
    }
    

    Ten en cuenta que en el bloque else, manejamos el caso en el que startKey es "1" (lo que significa que no hay valores de editDate). En este caso, usamos el valor máximo posible como endValue para la consulta. Esto garantiza que todas las publicaciones se devuelvan en el orden correcto.

Comments are closed.