Firebase查询以随机顺序检索数据。数据由autoID整理

时间:2019-01-23 07:04:18

标签: swift firebase

我具有以下数据库结构:

PVV  -自动识别       -数据1       -数据2       -状态:有效       -ImageName:Path \ FirebaseStorageImage.jpg

我想按时间顺序检索数据,然后以降序方式对数据进行排序(最新的优先)。

我认为autoID确实使用了日期和时间的组合,并且Firebase通常会以固定的顺序检索数据。我正在使用与以下相同的功能来检索文本数据(没有imageName),并且工作正常。

但是,下面的函数以随机顺序返回数据:

    func LoadDataFromImageTest() {
    self.ImageList.removeAll()
    self.ImageTestFromFBTableView.reloadData()

    databaseReference = Database.database().reference()

    let refPVV = Database.database().reference(withPath: "PVV").queryOrdered(byChild: "Status").queryEqual(toValue: "Active")

    refPVV.observeSingleEvent(of: .value, with: { [weak self] (snapshot) in

        //if the reference have some values
        if snapshot.childrenCount > 0 {

            //clearing the list
            self?.ImageList.removeAll()

            //iterating through all the values
            for PVV in snapshot.children.allObjects as! [DataSnapshot] {
                //getting values
                let PVVObject = PVV.value as? [String: AnyObject]
                // let PVVText  = PVVObject?["ImageString"]

                let PVVName = PVVObject?["Name"]
                let PVVBodyText = PVVObject?["BodyText"]
                let PVVValue = PVVObject?["PVVValue"]
                let Key = PVV.key
                let PVVImageName = PVVObject?["ImageName"] as! String?

   let imageURL = Storage.storage().reference().child(PVVImageName!)

                imageURL.downloadURL(completion: { (url, error) in

                    if error != nil {
                        print(error?.localizedDescription as Any)
                        return
                    }

                    PVVurlName = url
                let PVV = ImageModel(Name: PVVName as!String?, BodyText: PVVBodyText as! String?, PVVValue: PVVValue as! String?, Key: Key as String?, ImageName: PVVurlName as URL?)
                    self!.ImageList.insert(PVV, at: 0)
                    self?.ImageTestFromFBTableView.reloadData()
                })
            }
        }
        }
    )}

我在开始下载URL之前设置了调试点。每次运行时,它都会以不同的顺序返回PVVObject的值。

我有一棵这样的树:

挑战      -自动识别        -数据1        -数据2        -状态:有效

我已经回收了上面的函数以从上述树中检索数据,并且在同一位置设置调试点时,我总是以相同的顺序获取数据。

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

根据Firebase documentation,downloadURL方法是异步的。这意味着不能保证下载文件的检索顺序。当您处于downloadURL方法的完成区时,您不知道图像属于哪个PPV对象。

我认为最好的办法是更改代码的体系结构。为PPV创建一个具有imageUrl属性(附加到每个实例的对象)的对象模型类,并在观察到该属性的值变化时触发下载作业(例如在didSet方法中)。这样,您将确保下载的文件属于实例。