swift - SwiftUI / Firestore 显示您关注/收藏的用户的帖子
问题描述
我有一个有用户和培训师的应用程序。培训师可以发布锻炼供用户查看。用户也可以收藏培训师资料。我正在尝试使家庭提要仅显示用户喜爱的培训师的锻炼。
firestore 的结构是这样的:
集合、集合中的文档、这些文档中的字段或子集合
用户
一个。嵌套所有字段的用户 ID(姓名、电子邮件、ID 等...)
湾。(子集合)喜爱的培训师(培训师 ID)
培训师
一个。包含所有嵌套字段(姓名、电子邮件、ID 等)的培训师 ID
湾。(子集合)收藏夹用户(用户 ID)
锻炼
一个。包含所有嵌套字段的锻炼 ID(标题、培训师 ID、锻炼 ID 等...)
收藏教练的功能(添加到用户和教练子集合):
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) })
}
}
无论如何,当我最喜欢一个培训师帐户时,我可以去搜索锻炼,获取所有具有该培训师 ID 的锻炼,然后将它们添加到用户集合中名为“用户供稿”的新子集合中,然后将这些锻炼里面有身份证?
编辑:我正在考虑按照这样的功能从我所在的培训师资料中检索锻炼,然后在用户提要集合中设置数据:
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([:])
}
}
}
显然这是失败的,因为我认为您不能通过添加多个文档来处理集合数据。
解决方案
对最喜欢的教练执行 for 循环,并使用他们的 id 查询锻炼。
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)
}
}
然后在每个快照中,将锻炼添加到锻炼数组中。