2016-05-25 25 views
8

devo questi dati Firebase:Swift iOS: Firebase Paging

Firebase Data

voglio interrogare i dati posts attraverso l'impaginazione. Attualmente il mio codice è la conversione di questo codice JS in codice Swift

let postsRef = self.rootDatabaseReference.child("development/posts") 
postsRef.queryOrderedByChild("createdAt").queryStartingAtValue((page - 1) * count).queryLimitedToFirst(UInt(count)).observeSingleEventOfType(.Value, withBlock: { snapshot in 
.... 

    }) 

Quando si accede, questi dati page: 1, count: 1. Posso ottenere i dati per "posts.a" ma quando provo ad accedere a page: 2, count: 1 i resi sono ancora "posts.a"

Cosa mi manca qui?

+0

C'è un problema di logica. Per pagina: 1, conta: 1, la query inizia da 0 e restituisce 1 post. Per pagina: 2, conta: 1, la query inizia da 1 e restituisce 1 post. Entrambi si basano sul nodo createdAt che ha valori che sono in entrambi i casi più di 1 quindi restituirà sempre e solo il primo post. – Jay

risposta

11

Supponendo di utilizzare childByAutoId() o quando si spingeranno dati a Firebase, è possibile utilizzare queryOrderedByKey() per ordinare i dati in ordine cronologico. Doc here.

La chiave univoca si basa su un timestamp, quindi le voci dell'elenco verranno ordinate automaticamente in ordine cronologico.

Per avviare una chiave specifica, è necessario aggiungere la query con queryStartingAtValue(_:).

utilizzo Esempio:

var count = numberOfItemsPerPage 

var query ref.queryOrderedByKey() 

if startKey != nil { 
    query = query.queryStartingAtValue(startKey) 
    count += 1 
} 

query.queryLimitedToFirst(UInt(count)).observeSingleEventOfType(.Value, withBlock: { snapshot in 
    guard var children = snapshot.children.allObjects as? [FIRDataSnapshot] else { 
    // Handle error 
    return 
    } 

    if startKey != nil && !children.isEmpty { 
    children.removeFirst() 
    } 

    // Do something with children 
}) 
+0

come su ordine decrescente? Avere i dati più recenti prima? – KutakMir

+0

@KutakMir Penso di usare: 'queryEndingAtValue' con' queryLimitedToLast' –

+0

@KutakMir Penso che @levantAJ abbia ragione. Puoi usare questi metodi ma la chiave che stai passando dovrebbe essere diversa. Invece di utilizzare la chiave dell'ultimo elemento restituito da Firebase, utilizzerai la chiave del primo elemento. Inoltre, invece di 'removeFirst()', usa 'removeLast()'. Non posso testarlo ora, quindi dovresti provarlo per te. :) – timominous