2017-04-11 50 views
0

如何從Firebase逆轉此列表的順序?我希望最後一個項目是第一個。我試圖使用queryOrdered,但這沒有什麼區別。我列舉了我從火力地堡檢索數據結構的一個樣本:如何從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" 
      }, 

代碼:

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

Firebase數據庫沒有運營商按降序進行排序。因此,您必須將客戶端*的結果反轉,或添加一個包含倒排日期的值(如果將它們存儲爲時間戳,將會更容易)。有關更多信息,請參閱以下一些結果:http://stackoverflow.com/search?q=%5Bfirebase%5D%5Bswift%5D+descending –

回答

1

由於@Frank說,你需要你的結果的客戶端進行排序。

您可以像這樣的東西

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

數組排序,但如果你真的只是想扭轉陣列,可能簡單的只是在開始添加新的元素,而不是最終的

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

這隻會反轉返回的數據,這是一個問題,如果您在您的使用限制查詢 – Zigglzworth

+0

好點。如果您需要限制結果並反轉訂單,我認爲Firebase不會是一個好的解決方案。我懷疑你將不得不返回一切,並處理限制以及訂購客戶端。對於開始成爲問題的龐大數據庫 - 可能是時候查看不同的後端 – Russell