[Swift]从数据 Firebase 是无序的

标签: Xcode ios Swift
发布时间: 2017/1/29 22:18:39
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想对我的数据进行排序按日期,但看起来数据出来随机。谁能告诉我为什么我 queryOrdered(byChild: "startDate") 不工作?我又如何得到排序的数据吗?

你可以看到这里我数据结构︰复杂的查询

代码︰

DataService.ds.REF_USER_CURRENT.child("logs").observeSingleEvent(of: .value, with: {(userSnap) in

        if let SnapDict = userSnap.value as? [String:AnyObject]{
            //Run through all the logs
            for each in SnapDict{
                FIRDatabase.database().reference().child("logs/\(each.key)").queryOrdered(byChild: "startDate").observeSingleEvent(of: .value , with : {(Snap) in

                    let period = Period(logId: each.key, postData: Snap.value as! Dictionary<String, AnyObject>)
                    self.periods.append(period)

                    print(period.duration)
                    print(period.startDate)
                    self.tableView.reloadData()
                })
            }
        }
    })

期间︰

struct Period {

    var _periodId: String!
    var _startDate: String!
    var _duration: Int!
    var logs = [Log]()

    var _periodRef: FIRDatabaseReference!

    init() {

    }

    init(logId: String, postData: Dictionary<String, AnyObject>) {
        self._periodId = logId

        if let startDate = postData["startDate"] {
            self._startDate = startDate as? String
        }

        if let duration = postData["duration"] {
            self._duration = duration as? Int
        }

        _periodRef = DataService.ds.REF_PERIODS.child(_periodId)
    }
}

解决方法 1:

更改您的数据结构。

保留您的日志的像索引:-

logs
 -KVMbJKN1i2vAxzutiYq
   duration: 14
   index : 1 
   startDate: 28/10/2016

 -KVMbLL4i_9dwaRZ9REB
   duration: 28
   index : 2
   startDate: 01/09/2016

 -KVMiLwoSY34TZpf8mST
   duration: 14
   index : 3
   startDate: 2/2/2016
totalNoOfLogs : 3

如果您使用的结构在重新加载您的数据在你表只是排序前

self.periods.sort(by: {$0.index_Initial > $1.index_Initial})

你的结构:-

struct Period {

var _periodId: String!
var _startDate: String!
var _duration: Int!
var index_Initial : Int!

 ....}

其中 index_Initial 是你的日志的指数。检索和存储到您的结构。

索引可以跟踪的totalNoOfLogs数据库中保持一个单独的节点和递增每个 time 您的用户使日志。

或者,您可以尝试:-

FIRDatabase.database().reference().child("periods").observeSingleEvent(of: .value, with: {(userSnap) in

        for each in userSnap.children{

            if let eachSnapDict = (each as! FIRDataSnapshot).value as? [String:AnyObject]{


                print(eachSnapDict)

            }
        }
    })

但这种做法只会工作如果您有数据存储在数据库中以排序方式 (不首选选项)

官方微信
官方QQ群
31647020