我写了下面的代码,它应该由用户从Firebase返回memories
到tableView
。例如,如果用户a
登录到应用程序,则a
的所有内存都应位于tableView
中。
由于某种原因,它不起作用,您可以清楚地看到特定内存与用户具有相同的uid
。
它说“ Using an unspecified index. Your data will be downloaded and filtered on the client. Consider adding ".indexOn": "uid" at /MEmories to your security rules for better performance
”
func loadMemories() {
let userID = Auth.auth().currentUser?.uid
self.ref.child("MEmories").queryOrdered(byChild: "uid").queryEqual(toValue: userID!).observe(.value, with: { snapShot in
if let dict = snapShot.value as? NSDictionary {
for d in (dict as? Dictionary<String,AnyObject>)! {
let title = d.value["title"] as?String
let body = d.value["body"] as? String
let uid = d.value["uid"] as? String
let imageRef = d.value["imageRef"] as? String
let date = d.value["date"] as? NSNumber
let m = Memory(title: title!, body: body!, uid: uid!,imageRef:imageRef!, date: date!)
m.key = d.key
let tempImageRef = self.sref.child(m.imageRef)
tempImageRef.getData(maxSize: 1*1024*1024, completion: { (data,error) in
if error == nil {
if let imageData = data {
m.image = UIImage(data: imageData)
self.memories.append(m)
self.tbl.reloadData()
}
}
})
}
self.tbl.reloadData()
} // end of if
self.ref.child("MEmories").removeAllObservers()
})
}
答案 0 :(得分:-1)
已编辑
很抱歉,您的查询应返回与该uid
关联的内存。您是否仔细检查过
您的tableView tbl
已被委派/正确设置
您的图像和图像数据已正确加载(否则if
语句失败,并且未添加内存)
您可以将.observe
替换为.observeSingleEvent
,因此以后也无需删除观察者。
此外,您不应该为每个分支存储一个单独的uid分支。 User
和MEmories
(例如Lg7rOvv_pO3rXiUnRc_
)之类的分支是uid,因此您无需再创建另一个。您所有的User
分支子分支应由userId
而不是其他uid组成,然后创建一个单独的User-Memories
分支以包含该用户的记忆列表{ 1}},并且在每个uid
分支的子分支中都有一个memories
分支。
更好的数据结构可能看起来像这样:
Users