首页 > 解决方案 > 如果您将它放在 for 循环中,firestore 快照侦听器是否仍然有效?我的文档可以很好地加载到@published [] 但实时更新不起作用

问题描述

请注意下面代码中的 for 循环。'players' 数组定义为 @Published 这是我的课程,它是我稍后在 forEach 列表视图中呈现的 'players' 数组(不显示任何实时更新)

class PlayerRepository: ObservableObject {
    
    private let store = Firestore.firestore()
    private let path:       String = "Players"
    private let friendPath: String = "MyFriends"
    @Published var players:   [UserProfile] = []   
    @Published var friendIDs: [String] = []
    @EnvironmentObject var myDisplayControlCenter: DisplayControlCenter
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    var myfriendObjs = [Friends] ()
    
    
    
    init() {
        
        self.getFriendIDs()  
        
    }
     


   func getFriends() {
        
        for pid in friendIDs {
            store.collection(path).whereField(FieldPath.documentID(), isEqualTo: pid)
                .addSnapshotListener { querySnapshot, error in
                    guard let documents = querySnapshot?.documents else {
                        print("Error fetching documents: \(error!)")
                        return
                    }
                    for document in documents {
                        try? self.players.append(document.data(as: UserProfile.self)!)
                    }
                    print("Just fetched PLAYERS.  #: \(self.players.count)")
                }
        }
    }

后来,在我看来,正在观察的是 player[] 数组(它被声明为@ObservableObject)。forEach 循环效果很好,可以加载一个不错的玩家列表,但编辑、添加/更改永远不会为列表提供任何实时更新。我必须退出并回来查看更改。

这是我的观点的相关部分。

 struct PlayerListView: View {

    ////////////////////////
    /////    NOTE:  the players[] array that is @Published, resides in 'playerRepository' object below
    ////////////////////////

    @ObservedObject var playerRepository = PlayerRepository()
    @EnvironmentObject var authState: AuthenticationState
    @State var showAddPlayerForm = false
    @EnvironmentObject var myDisplayControlCenter: DisplayControlCenter
    @State var showDeleteAlert = false
    @State var showCopyView = false
    @State var deleteIndex = 0
    @State var deleteThisPlayer : [UserProfile] = []
    @State private var st = false
    
    

    var body: some View {
           
        NavigationView {
           
            VStack {
                GeometryReader { geometry in
                    
                    List {
                            Section(header: Text("Players I Have Created")) {
                            ForEach(playerRepository.players.sorted().filter({
                                "\($0.createdBy)" == self.authState.loggedInUser!.uid
                            }),id: \.self)
                            { player in

                                
                                VStack(alignment: .leading, spacing: 5) {
                                    Text("\(player.name)")
                                        .fontWeight(.regular)
                                        .font(.system(size: 16))
                                    Text("\(player.nickname)")
                                        .fontWeight(.light)
                                        .font(.system(size: 12))
                                    Text("\(player.email)")
                                        .fontWeight(.light)
                                        .font(.system(size: 12))
 
                                    NavigationLink(destination: PlayerDetailView(playerRepository: playerRepository, player: player, index: deleteIndex, editMode: 1)) {}
                                }
                            }

你能帮我理解为什么当“玩家”数组内容发生变化时我没有看到任何实时更新吗?

标签: google-cloud-firestoreswiftui

解决方案


推荐阅读