【问题标题】:How to reverse order of items from Firebase如何从 Firebase 反转项目的顺序
【发布时间】:2017-04-11 04:47:18
【问题描述】:

如何在 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()
                    }
                }
            }
        })
    }

【问题讨论】:

标签: ios swift firebase firebase-realtime-database


【解决方案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)

【讨论】:

  • 这只会反转返回的数据,如果您在查询中使用限制,则会出现问题
  • 好点。如果您需要限制结果并颠倒顺序,我认为 Firebase 不是一个好的解决方案。我怀疑您必须返回所有内容,并处理限制以及订购客户端。对于开始成为问题的大型数据库 - 可能是时候看看不同的后端了
【解决方案2】:

我正在使用的一个技巧是向我的对象添加一个字段,该字段将时间戳存储为反转值。我在持久化对象时计算的该字段的值是reversedDateCreated = timeStamp * -1 现在您可以使用默认的 Firebase orderBy 方法来按 reversedDateCreated 字段进行排序和分页

【讨论】:

    猜你喜欢
    • 2017-11-10
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    相关资源
    最近更新 更多