2017-01-07 3 views
0

Ich kämpfe seit Stunden um dieses und kann nicht scheinen, 2 Dinge zu verstehen.Firebase Paginierung - Swift 3

  1. Wie kann ich zeigen alle aktuellen Beiträge zuerst (die meiner Reihe von „Artikel“ und fügte hinzu. Ich bin „queryEndingAtValue“ mit „queryLimitedToLast“ verwenden und jetzt sind meine Beiträge gar nicht angezeigt.

  2. Mein, wenn es funktioniert es wurde mehrmals um die Elemente zu meinem Array hinzufügen.

Vielen Dank im Voraus.

Hier ist meine db snapshot sample of my db

Hier ist mein Code, sehr neu und wirklich nur weiß ich nicht zugeben zu Firebase, was hier .. Ich mache

func downloadPostsFromFirebase(withValue: String) { 
     // 1 - Get a reference to the database 
     ref = FIRDatabase.database().reference(withPath: "items-for-sale") 

     var startKey = withValue 

     var count = GlobalConstants.FirebaseConstants.numerOfPostsPerPage 

     var query = ref.queryOrderedByKey() 

     if startKey != nil { 
      query = query.queryEnding(atValue: startKey) 
      count += 1 
     } 

     query.queryLimited(toLast: UInt(count)).observeSingleEvent(of: .value, with: { snapshot in 
      guard var children = snapshot.children.allObjects as? [FIRDataSnapshot] else { 
       // Handle error 
       return 
      } 

      if startKey != nil && !children.isEmpty { 
       // TODO - If the number of items in the array is equal to the number of items in the db now, then stop? 
       for child in snapshot.children { 

        // instance of ItemForSale, it's added to the array that contains the latest version of the data. 
        let itemForSaleSingle = ItemForSale(snapshot: child as! FIRDataSnapshot) 

        startKey = itemForSaleSingle.key 

        self.items.append(itemForSaleSingle) 
        print("Total items count is \(self.items.count)") 
        self.collectionView?.reloadData() 

        print("start key is \(startKey)") 
       } 
      } 
     }) 
    } 
+0

Ich antwortete # 2 unten. Bitte beschränken Sie sich auf eine einzige Frage pro Post. Ich empfehle ein wenig nach der Paginierung zu suchen, da ich ziemlich sicher bin, dass ich in den letzten Wochen mehrmals Fragen dazu beantwortet habe. –

Antwort

3

Mein, wenn es funktioniert es die Elemente wurde hinzugefügt zu meinem Array mehrmals.

Sie hören ein value Ereignis. Dieses Ereignis wird ausgelöst, wenn sich die Daten der Abfrage ändern. Und wenn es ausgelöst wird, enthält es die vollständigen Daten für die Abfrage.

Das bedeutet, wenn Sie mit drei Elemente in der Liste zu starten, erhalten Sie diese drei Elemente:

1 
2 
3 

Dann, wenn Sie ein viertes Element hinzufügen, erhalten Sie einen Wert Veranstaltung mit:

1 
2 
3 
4 

Sie werden bemerken, dass es Überschneidungen zwischen der ursprünglichen Sammlung und der, die Sie nach dem Hinzufügen eines Werts erhalten, gibt, weshalb Sie doppelte Nachrichten sehen.

Der einfachste Weg, dies zu behandeln, ist für child_added Ereignisse anstelle von Wert Ereignisse zu hören. Im obigen Szenario würde man zunächst drei child_added Events:

1 
2 
3 

Und dann, wenn ein Element hinzugefügt, können Sie einen einzigen zusätzlichen child_added bekommen würde:

4 

Mit child_added vereinfacht auch Ihren Code , da Sie die Sammlung nicht mehr behandeln müssen:

query.queryLimited(toLast: UInt(count)).observeSingleEvent(of: .childAdded, with: { snapshot in 
    // instance of ItemForSale, it's added to the array that contains the latest version of the data. 
    let itemForSaleSingle = ItemForSale(snapshot: snapshot as! FIRDataSnapshot) 
+1

Um eine kurze Notiz hinzuzufügen: Wenn Sie eine Gruppe von Daten gleichzeitig über das .value-Ereignis einlesen müssen, um das Duplizieren von Daten zu vermeiden, müsste das Array jedes Mal neu initialisiert werden, damit es erneut mit Daten geladen werden kann; self.items = [] innerhalb der Schließung und vor dem Iterieren über die snapshot.children wird das tun. Aber wie @frankvanpuffelen angibt, ist das .childAdded-Ereignis normalerweise die beste Lösung. – Jay