Soy nuevo en SwiftUI y Firebase y estoy tratando de crear mi primera aplicación. Yo soy el almacenamiento de documentos del Juego en Firestore y uno de los campos es una matriz que contiene los identificadores de usuario de los jugadores, como se puede ver en la imagen.
Dicho esto, estoy tratando de lista de todos los juegos de un determinado usuario, y tener a todos los jugadores mencionados en cada una de las células (el orden es importante).
Con el fin de crear la lista de juegos en la interfaz de usuario que he creado un GameCellListView y un GameCellViewModel. El GameCellViewModel debe cargar los juegos y la variedad de usuarios que corresponden a los jugadores de cada juego. Sin embargo, yo no estoy siendo capaz de cargar a los usuarios a una matriz. Tengo que ir a través de los jugadores de la matriz y de consulta de la base de datos para cada Id y anexar a una matriz de Usuario; a continuación, debería ser capaz de devolver esta matriz de Usuario. Ya estoy usando un bucle for, yo no puedo asignar los valores a la matriz y, a continuación, volver. He intentado utilizar map(), pero no puedo realizar una consulta dentro de ella.
El objetivo es cargar de que "todos" var con una estructura que recibe un juego y sus jugadores GamePlayers(players: [User], game: Game)
Debe parecerse a la siguiente fragmento de código, pero los usuarios de la matriz siempre viene vacío. Esta función se ejecuta en GameCellViewModel init. Espero que puedan entender mi problema y gracias de antemano! Ha atascado en esto durante 2 semanas
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
}
}
}
}