我具有以下数据库结构:
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 -状态:有效
我已经回收了上面的函数以从上述树中检索数据,并且在同一位置设置调试点时,我总是以相同的顺序获取数据。
我在做什么错了?
答案 0 :(得分:1)
根据Firebase documentation,downloadURL方法是异步的。这意味着不能保证下载文件的检索顺序。当您处于downloadURL方法的完成区时,您不知道图像属于哪个PPV对象。
我认为最好的办法是更改代码的体系结构。为PPV创建一个具有imageUrl属性(附加到每个实例的对象)的对象模型类,并在观察到该属性的值变化时触发下载作业(例如在didSet方法中)。这样,您将确保下载的文件属于实例。