Я бы предложил другой подход и позволил бы Firestore сообщать вам, когда дочерние узлы (сообщения) были добавлены, изменены или удалены.Основываясь на вашем коде, ваша структура выглядит примерно так:
Users
uid
//some user data like name etc
Posts
post_0
likes: 0
post: "some post 0 text"
post_1
likes: 0
post: "text for post 1"
Давайте создадим класс для хранения сообщения в
class UserPostClass {
var postId = ""
var postText = ""
var likes = 0
init(theId: String, theText: String, theLikes: Int) {
self.postId = theId
self.postText = theText
self.likes = theLikes
}
}
, а затем массив для хранения UserPosts, который будетtableView dataSource
var postArray = [UserPostClass]()
затем ... нам нужен блок кода, чтобы сделать три вещи.Во-первых, когда новая запись добавляется в базу данных (или когда мы впервые запускаем приложение), добавьте ее в массив dataSource.Во-вторых, когда сообщение модифицируется, например, другому пользователю нравится сообщение, обновите массив, чтобы отразить новое число лайков.В-третьих, если сообщение удалено, удалите его из массива.Вот код, который делает все три ......
func populateArrayAndObservePosts() {
let uid = "uid_0" //this is the logged in user
let userRef = self.db.collection("users").document(uid)
let postsRef = userRef.collection("Posts")
postsRef.addSnapshotListener { documentSnapshot, error in
guard let snapshot = documentSnapshot else {
print("err fetching snapshots")
return
}
snapshot.documentChanges.forEach { diff in
let doc = diff.document
let postId = doc.documentID
let postText = doc.get("post") as! String
let numLikes = doc.get("likes") as! Int
if (diff.type == .added) { //will initially populate the array or add new posts
let aPost = UserPostClass(theId: postId, theText: postText, theLikes: numLikes)
self.postArray.append(aPost)
}
if (diff.type == .modified) { //called when there are changes
//find the post that was modified by it's postId
let resultsArray = self.postArray.filter { $0.postId == postId }
if let postToUpdate = resultsArray.first {
postToUpdate.likes = numLikes
}
}
if (diff.type == .removed) {
print("handle removed \(postId)")
}
}
//this is just for testing. It prints all of the posts
// when any of them are modified
for doc in snapshot.documents {
let postId = doc.documentID
let postText = doc.get("post") as! String
let numLikes = doc.get("likes") as! Int
print(postId, postText, numLikes)
}
}
}