Ios 当firebase中的数据更改时更新视图错误

Ios 当firebase中的数据更改时更新视图错误,ios,swift,firebase,google-cloud-firestore,swiftui,Ios,Swift,Firebase,Google Cloud Firestore,Swiftui,我目前正在从事这个项目,我需要从Firebase读取数据,并根据更改更新我的视图。每次我在firebase上更改数据时,我都会以奇怪的方式查看bug 这是我的学生班 struct Student : Identifiable { var id : String var name : String var surname : String var isAbsent : Bool var isBathroom : Bool } 在这里,我从firebase获

我目前正在从事这个项目,我需要从Firebase读取数据,并根据更改更新我的视图。每次我在firebase上更改数据时,我都会以奇怪的方式查看bug

这是我的学生班

struct Student : Identifiable {
    var id : String
    var name : String
    var surname : String
    var isAbsent : Bool
    var isBathroom : Bool
}
在这里,我从firebase获取数据并发布以获取数据的所有其他视图

class getStudents: ObservableObject {

    @Published var datas = [Student]()

    init() {
        let db = Firestore.firestore()
        let classRef = db.collection("5SA")

        classRef.order(by: "surname").addSnapshotListener {(snap,error) in
            if error != nil{
                print((error?.localizedDescription)!)
                return
            }


            for i in snap!.documentChanges{

                let id = i.document.documentID
                let name = i.document.get("name")as! String
                let surname = i.document.get("surname") as! String
                let isAbsent = i.document.get("absent") as! Bool
                let isBathroom = i.document.get("bathroom") as! Bool


                self.datas.append(Student(id: id, name: name, surname: surname, isAbsent: isAbsent, isBathroom: isBathroom))

              if i.type == .modified{
                    let isAbsent = i.document.get("absent") as! Bool
                    let isBathroom = i.document.get("bathroom") as! Bool
                    for j in 0..<self.datas.count{

                        if self.datas[j].id == id{

                            self.datas[j].isAbsent = isAbsent
                            self.datas[j].isBathroom = isBathroom
                        }
                    }
                }

            }

    }
}
}

请注意,当您有太多视图时,可能会发生奇怪的事情。尝试将一些组件分组到单独的视图中。欢迎使用Stackoverflow。你能在你的布局中发布一些“bug”的截图吗?我已经添加了两张关于该应用程序首次启动和出现bug的图片。请不要在问题中添加链接。链接可能会随着时间的推移而中断,如果这种情况发生,将使问题无效。请将图片添加到您的问题中。每次发生更改时,似乎都会向数据源数组中追加一个新的student对象<代码>self.data.append(学生)(很抱歉,它会自动放置链接。是的,这会造成问题吗?
struct ContentView: View {

    @ObservedObject var students = getStudents()

    var body: some View {
        NavigationView{

            VStack{
                ScrollView{
                Text("Menu")
                Menu().background(Color.white)
                Text("Future verifiche")
                HStack{
                    ScrollView(.horizontal, showsIndicators: false){
                        RoundedRectangle(cornerRadius: 20).frame(width:300,height: 300).foregroundColor(.white).overlay(Text("V. Matematica"))
                    }
                }
                Text("Oggi")
                HStack{
                    Spacer()
                    Text("Assenti ")
                    Spacer()
                    Text("In bagno")
                    Spacer()
                    Text("Presenti")
                    Spacer()
                }
                HStack{
                    Spacer()

                    ScrollView{
                        ForEach(students.datas,id: \.id){student in
                            VStack(spacing: 15){
                                if student.isAbsent{
                                    RoundedRectangle(cornerRadius: 20).frame(width:200,height: 100).foregroundColor(self.getColor(isAbsent: student.isAbsent, isBathroom: student.isBathroom)).overlay(Text(student.name))
                                }
                            }
                        }
                    }
                    Spacer()
                    ScrollView{
                        ForEach(students.datas,id: \.id){student in
                            VStack(spacing: 15){
                                if student.isBathroom{
                                    RoundedRectangle(cornerRadius: 20).frame(width:200,height: 100).foregroundColor(self.getColor(isAbsent: student.isAbsent, isBathroom: student.isBathroom)).overlay(Text(student.name))
                                }
                            }
                        }
                    }
                    Spacer()
                    ScrollView{
                        ForEach(students.datas,id: \.id){student in
                            VStack(spacing: 15){
                                if !student.isAbsent && !student.isBathroom{
                                    RoundedRectangle(cornerRadius: 20).frame(width:200,height: 100).foregroundColor(self.getColor(isAbsent: student.isAbsent, isBathroom: student.isBathroom)).overlay(Text(student.name))
                                }
                            }
                        }
                    }
                    Spacer()
                }
            }
            }.navigationBarTitle("Classe 5SA",displayMode: .inline)
        }.navigationViewStyle(StackNavigationViewStyle())

    }
    func getColor(isAbsent: Bool, isBathroom : Bool) -> Color {
        if isAbsent{
            return Color.red
        }
        if isBathroom{
            return Color.blue
        }
        return Color.green
    }
}


struct Menu : View {

    var body : some View{
        HStack{
            NavigationLink(destination: Studenti()){

                RoundedRectangle(cornerRadius: 30).frame(width: 150,height: 150).foregroundColor(.red).opacity(0.5).overlay(Text("Studenti").foregroundColor(.black))

            }
            NavigationLink(destination: Text("Overview")){

            RoundedRectangle(cornerRadius: 30).frame(width: 150,height: 150).foregroundColor(.green).opacity(0.5).overlay(Text("Overview").foregroundColor(.black))

            }
            NavigationLink(destination: Text("Orario")){
            RoundedRectangle(cornerRadius: 30).frame(width: 150,height: 150).foregroundColor(.blue).opacity(0.5).overlay(Text("Orario").foregroundColor(.black))
            }

            NavigationLink(destination: Text("Calendario")){

            RoundedRectangle(cornerRadius: 30).frame(width: 150,height: 150).foregroundColor(.orange).opacity(0.5).overlay(Text("Calendario").foregroundColor(.black))

            }
        }
    }
}

struct Studenti : View {
    @ObservedObject var students = getStudents()
    var body : some View {
        ForEach(students.datas,id: \.id){student in
            VStack{
                Rectangle().frame(width:300,height: 150).foregroundColor(self.getColor(isAbsent: student.isAbsent, isBathroom: student.isBathroom)).overlay(Text(student.name))
            }
        }
    }
    func getColor(isAbsent: Bool, isBathroom : Bool) -> Color {
        if isAbsent{
            return Color.red
        }
        if isBathroom{
            return Color.blue
        }
        return Color.green
    }
}