SwiftUI / Firestore Отображение сообщений от пользователей, за которыми вы следуете / избранное

# #swift #xcode #firebase #google-cloud-firestore

Вопрос:

У меня есть приложение, в котором есть пользователи и тренеры. Тренеры могут публиковать тренировки для просмотра пользователями. У пользователя также есть возможность выбрать профиль тренера в избранное. Я пытаюсь сделать так, чтобы в домашней ленте показывались только тренировки от тренеров, которые были выбраны пользователем.

Структура магазина firestore выглядит следующим образом:

КОЛЛЕКЦИИ, ДОКУМЕНТЫ В КОЛЛЕКЦИИ, ПОЛЯ В ЭТИХ ДОКУМЕНТАХ ИЛИ ВЛОЖЕННЫЕ КОЛЛЕКЦИИ

  1. Пользователи

    a. идентификатор пользователя со всеми вложенными полями (имя, адрес электронной почты, идентификатор и т. Д.)

    b. (подколлекция) избранные-тренеры (идентификатор тренера)

  2. кроссовки

    a. идентификатор тренера со всеми вложенными полями (имя, адрес электронной почты, идентификатор и т. Д.)

    b. (подколлекция) избранное-пользователи (идентификатор пользователя)

  3. тренировки

    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. Я внес правку в свой первоначальный вопрос с помощью функции, которую я собирался попробовать. Разве я не смог бы сделать что-то в этом роде?