Firestore имеет коллекцию «пользователей» и «постов». Каждый документ пользователя имеет коллекцию "сообщений". «Posts» имеет тип ссылки «post», а значение «posts / documentID».
Я хочу получить список сообщений пользователя, я пытался реализовать с помощью следующего кода, но «print (self. postsData) "пусто.
Как я могу это сделать?
class postFetcher: ObservableObject {
@Published var postsData: [PostModel] = []
private let userDefaults = UserDefaults.standard
private let uid: String
private var db: Firestore!
private let dispatchGroup = DispatchGroup()
private let dispatchQueue = DispatchQueue(label: "queue")
init() {
db = Firestore.firestore()
uid = self.userDefaults.object(forKey: "userDataUid") as! String
fetchPostsData()
}
func fetchPostsData() {
self.db.collection("users").document(uid).collection("posts").getDocuments { (snaps, err) in
guard let snaps = snaps else { return }
for document in snaps.documents {
self.dispatchGroup.enter()
self.dispatchQueue.async(group: self.dispatchGroup) { [weak self] in
self?.asyncProcess(document: document) { () -> Void in
self?.dispatchGroup.leave()
}
}
}
self.dispatchGroup.notify(queue: .main) {
print(self.postsData)
}
}
}
func asyncProcess(document: QueryDocumentSnapshot, completion: () -> Void) {
let refarence: DocumentReference = document.data()["post"] as! DocumentReference
refarence.getDocument { (snap, err) in
guard let snap = snap else { return }
self.postsData.append(PostModel(
documentId: snap.documentID,
text: snap.data()!["text"] as! String
))
}
completion()
}
}