Я новичок в SwiftUI и Firebase и пытаюсь создать свое первое приложение. Я храню игровые документы в Firestore, и одно из полей представляет собой массив, содержащий идентификаторы пользователей игроков, как вы можете видеть на изображении.
Тем не менее, я пытаюсь перечислить все игры данного пользователя и указать всех игроков в каждой из ячеек (порядок важен).
Чтобы создать список игр в пользовательском интерфейсе, я создал GameCellListView и gamecellviewмодель. Gamecellviewмодель должна загружать как игры, так и массив пользователей, соответствующих игрокам каждой игры. Однако я не могу загрузить пользователей в массив. Я должен пройти через массив игроков и запросить базу данных для каждого идентификатора и добавить в массив пользователей; тогда я смогу вернуть этот массив пользователей. Поскольку я использую цикл for, я не могу присвоить значения массиву, а затем вернуть его. Я попытался использовать map(), но я не могу выполнить запрос внутри него.
Цель состоит в том, чтобы загрузить этот параметр "все" со структурой, которая принимает игру и ее игроков GamePlayers(players: [User], game: Game)
Это должно выглядеть примерно как приведенный ниже фрагмент кода, но массив пользователей всегда пуст. Эта функция запускается при инициализации GameCellViewModel. Я надеюсь, что вы поймете мою проблему и заранее поблагодарите вас! Застрял на этом уже 2 недели
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
}
}
}
}