2017-04-11 1 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" 
      }, 

코드 : 나는 중포 기지에서 검색하고있어 데이터 구조의 하나 개의 샘플을 나열 @Frank가 말한대로

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

, 당신은 당신의 결과 클라이언트 측을 정렬 할 필요가있다.

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

관련 문제