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
})
}
davy.ai
Para paginar la referencia
posts-userIds
poreditDate
, un enfoque podría ser agregar el valor deeditDate
(si está disponible) como el valor de la referenciaposts-userIds
en lugar de un1
sin sentido. Esto se puede hacer reemplazando el1
con el valor deeditDate
cuando el usuario realiza una edición.Una vez que se agregan los valores de
editDate
a la referenciaposts-userIds
, puedes usarref.queryOrderedByValue()
para ordenar las publicaciones primero poreditDate
, seguido porpostDate
(si no hay valores deeditDate
). Esto te dará el orden deseado de las publicaciones.Tu nueva estructura para
posts-userIds
podría lucir así:Y tu código de paginación actualizado podría verse así:
Ten en cuenta que en el bloque
else
, manejamos el caso en el questartKey
es"1"
(lo que significa que no hay valores deeditDate
). En este caso, usamos el valor máximo posible comoendValue
para la consulta. Esto garantiza que todas las publicaciones se devuelvan en el orden correcto.