2016-05-25 1 views
8

Ich habe diese Daten Firebase:Swift iOS: Firebase Paging

Firebase Data

Ich möchte die posts Daten durch Paginierung abzufragen. Derzeit ist mein Code konvertiert diese JS Code Swift Code

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

    }) 

Beim Zugriff auf diese Daten page: 1, count: 1. Ich kann die Daten für "posts.a" bekommen, aber wenn ich versuche, auf page: 2, count: 1 zuzugreifen, ist die Rückkehr immer noch "posts.a"

Was fehlt mir hier?

+0

Es gibt eine logische Frage. Für Seite: 1, Anzahl: 1 beginnt die Abfrage bei 0 und gibt 1 Post zurück. Für Seite: 2, Anzahl: 1, beginnt die Abfrage bei 1 und gibt 1 Post zurück. Beide basieren auf dem createdAt-Knoten, der Werte hat, die beide mehr als 1 sind, so dass nur der erste Post zurückgegeben wird. – Jay

Antwort

11

Angenommen, Sie verwenden oder verwenden childByAutoId(), wenn Sie Daten an Firebase senden, können Sie queryOrderedByKey() verwenden, um Ihre Daten chronologisch zu sortieren. Doc here.

Der eindeutige Schlüssel basiert auf einem Zeitstempel, so dass Listenelemente automatisch chronologisch geordnet werden.

Um mit einem bestimmten Schlüssel zu beginnen, müssen Sie Ihre Abfrage an queryStartingAtValue(_:) anhängen.

Verwendungsbeispiel:

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

Wie wäre es mit absteigender Reihenfolge? Die neuesten Daten zuerst haben? – KutakMir

+0

@KutakMir Ich denke, verwenden: 'queryEndingAtValue' mit' queryLimitedToLast' –

+0

@KutakMir Ich denke @belevantAJ hat Recht. Sie können diese Methoden verwenden, aber der Schlüssel, den Sie übergeben werden, sollte anders sein. Anstatt den Schlüssel des letzten von Firebase zurückgegebenen Objekts zu verwenden, verwenden Sie den Schlüssel des ersten Elements. Verwenden Sie anstelle von 'removeFirst()' '' removeLast() '. Ich kann das jetzt nicht testen, also solltest du es selbst ausprobieren. :) – timominous