我有以下数据库结构:
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/