首页 > 解决方案 > SwiftUI / Firestore 显示您关注/收藏的用户的帖子

问题描述

我有一个有用户和培训师的应用程序。培训师可以发布锻炼供用户查看。用户也可以收藏培训师资料。我正在尝试使家庭提要仅显示用户喜爱的培训师的锻炼。

firestore 的结构是这样的:

集合、集合中的文档、这些文档中的字段或子集合

  1. 用户

    一个。嵌套所有字段的用户 ID(姓名、电子邮件、ID 等...)

    湾。(子集合)喜爱的培训师(培训师 ID)

  2. 培训师

    一个。包含所有嵌套字段(姓名、电子邮件、ID 等)的培训师 ID

    湾。(子集合)收藏夹用户(用户 ID)

  3. 锻炼

    一个。包含所有嵌套字段的锻炼 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([:])
        }
        
        
    }
}

显然这是失败的,因为我认为您不能通过添加多个文档来处理集合数据。

标签: swiftxcodefirebasegoogle-cloud-firestore

解决方案


对最喜欢的教练执行 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)
   }
}

然后在每个快照中,将锻炼添加到锻炼数组中。


推荐阅读