Jsem nový SwiftUI a Firebase a snažím se stavět můj první app. Já jsem ukládání Hry dokumentů v Firestore a jedno z polí je pole obsahující uživatelská jména hráčů, jak můžete vidět na obrázku.
Řekl jsem, že jsem se snažím, aby seznam všech her daného uživatele a mít všechny hráče uvedené v jednotlivých buňkách (pořadí je důležité).
S cílem vytvořit seznam her v ROZHRANÍ jsem vytvořil GameCellListView a GameCellViewModel. Na GameCellViewModel by zatížení obou her a pole uživatelů, které odpovídají hráči na každou hru. Nicméně nejsem schopen načíst uživatele do pole. Musím jít přes hráče pole a zadat dotaz do databáze pro každou Id a připojit se k Uživateli pole, pak bych měl být schopen vrátit to Uživatelská pole. Od té doby používám pro smyčce, nemůžu přiřadit hodnoty do pole a pak se vrátit. Snažil jsem se pomocí map(), ale nemůžu provést dotazu uvnitř.
Cílem je, aby zatížení, které "všechny" var s struct, který obdrží hru a jeho hráči GamePlayers(players: [User], game: Game)
Mělo by to vypadat něco jako fragment kódu níže, ale uživatelé pole vždy vrátí prázdný. Tato funkce pracuje na GameCellViewModel init. Doufám, že můžete pochopit můj problém a předem děkuji! Byla přilepená na to za 2 týdny
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
}
}
}
}