试图将用户的帖子提取到他的个人资料中。我正在使用collectionview来显示数据,但没有显示任何内容。
这是我用来用他们的uid获取用户帖子的功能。这是我的Firebase数据库
//variables firebase
var currentUser = Auth.auth().currentUser
let databaseRef = Database.database().reference()
let storage = Storage.storage().reference()
//VARS
var postsuser = [ProfileUserPosts]()
func observeUserPosts() {
let uid = Auth.auth().currentUser?.uid
databaseRef.child("posts").queryOrdered(byChild: "timestamp").queryEqual(toValue: uid!).observe(.value) { (snapshot) in
var tempPost = [ProfileUserPosts]()
for child in snapshot.children {
if let childSnapshot = child as? DataSnapshot {
let dict = childSnapshot.value as? [String: Any]
let address = dict!["address"] as? String
let breed = dict!["breed"] as? String
let phoneuser = dict!["phone"] as? String
let photoUrl = dict!["photoUrl"] as? String
let url = URL(string: photoUrl!)
let post = ProfileUserPosts(address: address!, breed: breed!, phone: phoneuser!, photoUrl: url!)
tempPost.insert(post, at: 0)
}
self.postsuser = tempPost
self.postsCollectionView.reloadData()
}
}
}
给Firestore看看。你可能会发现它更好。无论如何,听起来您需要了解如何构建数据库。一旦你这样做,获取/设置/更新/删除/查询是微不足道的。请参阅Best practices for data structure文档。
Avoid nesting data
由于Firebase实时数据库允许最多嵌套数据深度为32级,因此您可能会认为这应该是默认结构。但是,当您在数据库中的某个位置获取数据时,还会检索其所有子节点。此外,当您在数据库中的某个节点上授予某人读取或写入权限时,您还可以授予他们访问该节点下所有数据的权限。因此,在实践中,最好保持数据结构尽可能平坦。
Flatten data structures
如果将数据拆分为单独的路径(也称为非规范化),则可以根据需要在单独的调用中有效地下载数据。考虑这种扁平结构:
Create data that scales
构建应用程序时,通常最好下载列表的子集。如果列表包含数千条记录,这种情况尤为常见。当此关系是静态且单向的时,您可以简单地将子对象嵌套在父对象下。
有时,这种关系更具动态性,或者可能需要对此数据进行非规范化。很多时候,您可以通过使用查询来检索数据的子集来对数据进行非规范化,如检索数据中所述。