2017-04-11 45 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