# #swift #xcode #firebase #google-cloud-firestore
Вопрос:
У меня есть приложение, в котором есть пользователи и тренеры. Тренеры могут публиковать тренировки для просмотра пользователями. У пользователя также есть возможность выбрать профиль тренера в избранное. Я пытаюсь сделать так, чтобы в домашней ленте показывались только тренировки от тренеров, которые были выбраны пользователем.
Структура магазина firestore выглядит следующим образом:
КОЛЛЕКЦИИ, ДОКУМЕНТЫ В КОЛЛЕКЦИИ, ПОЛЯ В ЭТИХ ДОКУМЕНТАХ ИЛИ ВЛОЖЕННЫЕ КОЛЛЕКЦИИ
- Пользователи
a. идентификатор пользователя со всеми вложенными полями (имя, адрес электронной почты, идентификатор и т. Д.)
b. (подколлекция) избранные-тренеры (идентификатор тренера)
- кроссовки
a. идентификатор тренера со всеми вложенными полями (имя, адрес электронной почты, идентификатор и т. Д.)
b. (подколлекция) избранное-пользователи (идентификатор пользователя)
- тренировки
a. идентификатор тренировки со всеми вложенными полями (название, идентификатор тренера, идентификатор тренировки и т. Д.)
Функция для избранного тренера (добавляет в подборки пользователей и тренеров):
func favorite() {
guard let trainerUid = trainer.id else { return }
guard let currentUid = AuthViewModel.shared.userSession?.uid else { return }
COLLECTION_USERS.document(currentUid).collection("favorited-trainers").document(trainerUid).setData([:])
COLLECTION_TRAINERS.document(trainerUid).collection("favorites-users").document(currentUid).setData([:])
self.trainer.isFavorited = true
}
Текущий дисплей домашней страницы просто показывает вам все тренировки в приложении с этой функцией:
func fetchAllWorkouts() {
COLLECTION_WORKOUTS.order(by: "timestamp", descending: true).addSnapshotListener { snapshot, _ in
guard let documents = snapshot?.documents else { return }
self.workouts = documents.compactMap({ try? $0.data(as: Workout.self) })
}
}
Есть ли в любом случае, когда у меня есть учетная запись тренера, я могу перейти и выполнить поиск по тренировкам, получить все тренировки, у которых есть этот идентификатор тренера, а затем добавить их в новую дополнительную коллекцию в коллекции пользователей под названием «лента пользователей» и поместить в нее эти идентификаторы тренировок?
РЕДАКТИРОВАТЬ: Я думал о такой функции, как эта, чтобы извлекать тренировки из профиля тренера, в котором я нахожусь, а затем настраивать данные в коллекции каналов пользователей:
func addWorkoutsToFeed(){
guard let trainerUid = trainer.id else { return }
guard let currentUid = AuthViewModel.shared.userSession?.uid else { return }
COLLECTION_WORKOUTS.whereField("ownerUid", isEqualTo: trainerUid).addSnapshotListener { snapshot, _ in
guard let documents = snapshot?.documents else { return }
let workouts = documents.compactMap({ try? $0.data(as: Workout.self) })
workouts.forEach { id in
COLLECTION_USERS.document(currentUid).collection("user-feed").document(workouts).setData([:])
}
}
}
Очевидно, что это не удается, потому что я не думаю, что вы можете сделать это с помощью набора данных, добавив несколько документов.
Ответ №1:
сделайте цикл for для любимых тренеров и запросите данные о тренировках с их идентификаторами.
var workouts : [Workout] = []
for trainer in favTrainer {
fetchTrainerWorkouts(withId : trainer.Uid){ workouts in
self.workouts = workouts
}
}
fetchTrainerWorkouts:
func fetchTrainerWorkouts(withId trainerId: String , compilation : @escaping : ([Workout])->Void){
WORKOUT_COLLECTION.whereField("TrainerUid" , isEqualTo:trainerId).addSnapshotListener { snapshot, _ in
guard let documents = snapshot?.documents else { return }
let workouts = documents.compactMap({ try? $0.data(as: Workout.self) })
compilation(workouts)
}
}
затем в каждом снимке добавляйте тренировки в свой массив тренировок.
Комментарии:
1. Я внес правку в свой первоначальный вопрос с помощью функции, которую я собирался попробовать. Разве я не смог бы сделать что-то в этом роде?