2017-04-11 3 views
0

Wie kann ich die Reihenfolge dieser Liste in Firebase umkehren? Ich möchte, dass der letzte Gegenstand der erste ist. Ich habe versucht, queryOrdered zu verwenden, aber das machte keinen Unterschied. I aufgeführt eine Probe der Datenstruktur, die ich von Firebase bin Abrufen:So ändern Sie die Reihenfolge der Elemente von Firebase

"-KhPRPQEOiVzPW7G2iQI" : { 
      "amount" : "20", 
      "coordinate" : { 
       "lat" : 28.10388759332169, 
       "long" : -81.46038228976457 
      }, 
      "creationTime" : "2017-04-11 00:37:29 +0000", 
      "creator" : "6MAK7nkzoBT6NzIxj7DW3564cf72", 
      "description" : "A ride ", 
      "distanceRadius" : 1609.34, 
      "expireTime" : "2017-04-11 03:37:00 +0000", 
      "paymentNonce" : "51df2b01-9e97-0fce-14d5-fc8fdf98603c", 
      "provider" : "PSEFUZdAAxRH14oYnyzE7yMpcil1", 
      "status" : "accepted" 
      }, 

Code:

func retrieveRquestFromFir(){ 
     var searchType:String! 
     switch self.messageType { 
     case messageTypeEnum.creator: 
      searchType = "creator" 
      break 
     case messageTypeEnum.provider: 
      searchType = "provider" 
      break 
     } 
     //TODO: Fix here 
     let path = "rquest/frontEnd/posts/userCreatedPost" 
     self.childRef(path).queryOrdered(byChild: "creationTime") .observe(.childAdded, with: {snapshot in 
      if let snapDict = snapshot.value as? NSDictionary { 
       if let postId = snapDict[searchType] as? String { 
        if postId == self.currentUserId()! { 
         let rquestId = snapshot.key 
         let status = snapDict["status"] as! String 
         //check to see if message is pending or accepted in order to show messages 
         if status == "pending" || status == "accepted" { 
          let description = snapDict["description"] as! String 
          let amount = snapDict["amount"] as! String 
          let creator = snapDict["creator"] as! String 
          var provider:String? 
          // calculate expire time here 
          var expireTime:String! 
          let dateString = snapDict["expireTime"] as! String 
          var date:Date! 
          if status == "pending" { 

           date = Date(string: dateString, format: "yyyy-MM-dd HH:mm:ss Z")! 
           if date < Date() { 
            return 
           } 
          }else if status == "accepted" { 
           expireTime = snapDict["expireTime"] as! String 
           date = Date(string: dateString, format: "yyyy-MM-dd HH:mm:ss Z")! 
          } 
          if let providerUser = snapDict["provider"] as? String { 
           provider = providerUser 
          } 
          let array = [ 
           "expireTime":dateString, 
           "amount":amount, 
           "description":description, 
           "rquestId":rquestId, 
           "status": status, 
           "provider":provider as Any, 
           "creator": creator 
           ] as NSDictionary 
          //check if date is more than 5 days if it is more than dont Added 
          let dateAmount = Date.daysBetween(start: date, end: Date()) 
          // let StringDate = newDate?.string(withFormat: "yyyy-MM-dd HH:mm:ss Z") 

          if dateAmount <= 5 { 
           DispatchQueue.main.async { 
            self.RquestInfoArray.append(array) 

            self.tableView.reloadData() 
           } 
          } 
         } 
        } 
       }else { 
        DispatchQueue.main.async { 
         self.RquestInfoArray.append(array) 
         self.tableView.reloadData() 
        } 
       } 
      } 
     }) 
    } 
+0

In der Firebase-Datenbank muss kein Operator durch absteigende Werte sortiert werden. Sie müssen entweder die Ergebnisse clientseitig umkehren * oder * einen Wert hinzufügen, der das invertierte Datum enthält (was einfacher ist, wenn Sie sie als Zeitstempel speichern). Für mehr, sehen Sie einige dieser Ergebnisse: http://stackoverflow.com/search?q=%5Bfirebase%5D%5Bswift%5D+descending –

Antwort

1

Wie @Frank sagt, müssen Sie Ihre Ergebnisse Client-Seite sortieren.

können Sie entweder sortieren das Array mit so etwas wie diese

let sorted = self.RquestInfoArray.sorted(by: { (r1: RequestInfoType, r2: RequestInfoType) -> Bool in 
      return r1.dateAmount > r2.dateAmount 
}) 

aber wenn Sie wirklich nur das Array umkehren wollen, wahrscheinlich einfacher sein, Ihre neue Elemente am Anfang hinzuzufügen statt am Ende

self.RquestInfoArray.insert(contentsOf: array, at: 0) 
+0

Dies invertiert nur die zurückgegebenen Daten, die ein Problem ist, wenn Sie ein Limit in Ihrem verwenden Abfrage – Zigglzworth

+0

guten Punkt. Ich denke nicht, dass Firebase eine gute Lösung wäre, wenn Sie die Ergebnisse einschränken und die Bestellung stornieren müssen. Ich vermute, Sie müssten alles zurückgeben und sowohl die limitierende als auch die bestellende Client-Seite behandeln. Für riesige Datenbanken, die zu einem Problem werden könnten, wäre es vielleicht an der Zeit, ein anderes Backend zu betrachten – Russell

Verwandte Themen