Som nový SwiftUI a Firebase a snažím sa vybudovať moja prvá aplikácia. Ja som ukladanie Hry dokumenty v Firestore a jednou z oblastí je pole obsahujúce id používateľov hráčov, ako môžete vidieť na obrázku.
Ako už bolo povedané, snažím sa zoznam všetky hry daného používateľa a mať všetkých hráčov uvedených v každej jednej bunky (poradie je dôležité).
S cieľom vytvoriť zoznam hier v UI vytvoril som GameCellListView a GameCellViewModel. Na GameCellViewModel by zaťaženia oboch hier a množstvo užívateľov, ktoré zodpovedajú hráčov každej hre. Avšak nie som schopný načítať používateľov na pole. Musím ísť cez hráčov pole a dotaz na databázu pre každý Identifikátor a pridať Používateľské pole; potom by som mal byť schopný vrátiť sa toto Užívateľské pole. Pretože som používať pre slučky, nemôžem priradenie hodnoty do poľa a potom ju vrátiť. Snažil som sa pomocou mapy(), ale nemôžem vykonať dotaz vnútri neho.
Cieľom je nahrať, že "všetky" var s struct, že dostane hre a jeho hráčov GamePlayers(players: [User], game: Game)
Malo by to vyzerať asi útržok kódu nižšie, ale používateľov pole vždy dodávaný prázdny. Táto funkcia sa spúšťa na GameCellViewModel init. Dúfam, že budete môcť pochopiť môj problém a ďakujem vopred! Boli prilepené na to 2 týždne
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
}
}
}
}