Jestem nowy w SwiftUI i Firebase i próbuję stworzyć swoją pierwszą aplikację. Trzymam gier dokumenty w Firestore, i jedno z pól jest tablicą zawierającą identyfikatory użytkowników, graczy, jak widać na obrazku.
Tym nie mniej, staram się wymienić wszystkie gry tego użytkownika i podanie wszystkich graczy w każdej z komórek (kolejność jest ważna).
Aby utworzyć listę gier w interfejsie użytkownika, założyłem GameCellListView i gamecellviewмодель. Gamecellviewмодель musi wczytywać gry, jak i masyw użytkowników, odpowiednich graczy do każdej gry. Jednak nie mogę pobrać użytkowników w tablicę. Muszę przejść przez tablicę graczy i poprosić o bazę danych dla każdego konta i dodać do tablicy użytkowników; wtedy będę mógł odzyskać ten masyw użytkowników. Ponieważ używam pętli for, nie mogę przypisać wartości do tablicy, a następnie go zwrócić. Próbowałem korzystać z map(), ale nie mogę wykonać żądania wewnątrz niego.
Celem jest, aby pobrać ten parametr "wszystko" ze strukturą, która podejmuje grę i jej graczy GamePlayers(players: [User], game: Game)
Powinno to wyglądać jak poniżej fragment kodu, ale tablica użytkowników jest zawsze pusta. Funkcja ta uruchamia się przy inicjalizacji GameCellViewModel. Mam nadzieję, że zrozumiecie mój problem i z góry podziękuj ciebie! Zatrzymany na tym już 2 tygodnie
func loadData() {
let userId = Auth.auth().currentUser?.uid
db.collection("games")
.order(by: "createdTime")
.whereField("userId", isEqualTo: userId)
.addSnapshotListener { (querySnapshot, error) in
if let querySnapshot = querySnapshot {
self.games = querySnapshot.documents.compactMap { document in
do {
let extractedGame = try document.data(as: Game.self)
var user = [User]()
let users = extractedGame!.players.map { playerId -> [User] in
self.db.collection("users")
.whereField("uid", isEqualTo: playerId)
.addSnapshotListener { (querySnapshot, error) in
guard let documents = querySnapshot?.documents else {
print("No documents")
return
}
user = documents.compactMap { queryDocumentSnapshot -> User? in
return try? queryDocumentSnapshot.data(as: User.self)
}
}
return user
}
self.all.append(GamePlayers(players: users.first ?? [User](), game: extractedGame!))
return extractedGame
}
catch {
print(error)
}
return nil
}
}
}
}