Я считаю, что вопрос в том, как получить сообщения для определенного пользователя. Структура выглядит хорошо, но нет необходимости иметь дочерний узел «автор» в каждом сообщении, поэтому вместо этого:
posts
post_id_0
author
author data
text: "Hello, World"
uid: "uid_0"
сделайте это
posts
post_id_0
text: "Hello, World"
uid: "uid_0"
name: "usmaan"
photoURL:"https://firebasestorage..."
Итак, теперь просто запросите этих пользователей сообщений (это для Firestore, прокрутите вниз для решения RTDB) ...
func getThisUsersPosts() {
let uid = "uid_0" //this users uid
self.db.collection("posts]").whereField("uid", isEqualTo: uid).getDocuments { (snapshot, error) in
if let err = error {
print(err.localizedDescription)
return
}
if let doc = snapshot?.documents {
for d in doc {
let text = d.get("text") as? String ?? "No Post Text"
print(text)
}
} else {
print("no posts found")
}
}
}
self.db указывает на мой Firestore.
EDIT:
OP использует базу данных реального времени, поэтому вот код для этого
func getThisUsersPosts() {
let uid = "uid_0"
let ref = self.ref.child("posts") //self.ref points to MY firebase.
let query = ref.queryOrdered(byChild: "uid").queryEqual(toValue: uid)
query.observeSingleEvent(of: .value, with: { snapshot in
let allPosts = snapshot.children.allObjects as! [DataSnapshot]
for postSnap in allPosts {
let text = postSnap.childSnapshot(forPath: "text").value as? String ?? "No Text"
print(text)
}
})
}
EDIT 2:
OP хочет сохранить ту же структуру.
Для запроса данных на двухуровневой глубине мы используем так называемый Deep Query и будет выглядеть примерно так:
func performDeepQuery() {
let uid = "uid_0"
let ref = self.ref.child("posts")
let query = ref.queryOrdered(byChild: "author/uid").queryEqual(toValue: uid)
query.observeSingleEvent(of: .value, with: { snapshot in
let allPosts = snapshot.children.allObjects as! [DataSnapshot]
for postSnap in allPosts {
//populate your tableView datasource here
let post = PostClass()
post.postId = postSnap.key
post.name = postStap.childSnapshot("name").value as? String ?? "No Post Name"
post.text = postStap.childSnapshot("text").value as? String ?? "No Post Text"
self.postArray.append(post)
}
self.myTableView.reloadData()
})
}
, который будет выполнять глубокий запрос к этой структуре
posts
post_0
author
uid: "uid_0"
name: "post 0 name"
text: "post 0 text"
PostClass может быть следующим
class PostClass {
var postId = ""
var name = ""
var text = ""
}
Дополнительная информация:
Чтобы получить текущий пользовательский uid (который также рассматривается в руководстве по началу работы) и предполагая, что вы аутентифицированы (иначе будет ноль)
guard let user = Auth.auth().currentUser else { return }
let uid = user.uid