swift - Firebase 查询以随机顺序检索数据。数据按autoID组织

标签 swift firebase

我有以下数据库结构:

PVV -- 自动识别 - 数据1 - 数据2 - 状态:活跃 - 图片名称: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 - 状态:活跃

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

我做错了什么?

最佳答案

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

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

关于swift - Firebase 查询以随机顺序检索数据。数据按autoID组织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54321679/

相关文章:

javascript - 使用 firebase 的即时模式自动登录

javascript - 与 Firebase 的协作实时 map 无法正常工作

javascript - 如何在 Firestore 中使文档字段 = map ?

ios - 错误 : Use of unresolved identifier 'indexPath'

ios - 如何验证自定义 Eureka 行中的文本字段等对象?

android - 使用 Firebase BaaS 通过 Android 登录 Facebook

ios - FCM 后台通知在 iOS 中不起作用

ios - 如何将 html 表单加载到 webview 或 safari?

ios - 如何在嵌入式 UIImagePickerController 中隐藏导航栏

ios - Swift如何将tableView移回GroundView标签