如何避免在更新可观察对象时出现无限循环?

时间:2020-06-01 12:12:55

标签: swift swiftui

我的应用程序的结构包含训练,锻炼和练习。用户可以在UI中添加所有这些数据。我在init()中添加了示例数据。 我想检查某项训练是否有锻炼,以及每项锻炼是否都有锻炼(至少一项)。如果是这样,我想准备好培训。

我的代码存在的问题是,当我更新培训准备就绪时,我再次触发checkIfTrainingIsReady()并陷入无休止的循环,并且我的应用程序崩溃了。我怎么能以最佳实践的方式认识到这一点?

class AppState: ObservableObject {

    var trainings: [Training] {
        set {
            if let encoded = try? JSONEncoder().encode(newValue) {
                let defaults = UserDefaults.standard
                 defaults.set(encoded, forKey: "trainings")
            }
            objectWillChange.send()
            self.checkIfTrainingIsReady()
        }
        get {
            if let savedTrainings = UserDefaults.standard.object(forKey: "trainings") as? Data,
                let loadedTraining = try? JSONDecoder().decode([Training].self, from: savedTrainings) {
                return loadedTraining
            }
            return []
        }
    }

    init() {

        self.trainings = [
            Training(name: "Mein Plan", workouts: [
                Workout(name: "Ganzkörper A", exercises: [
                    Exercise(name: "Bankdrücken"),
                    Exercise(name: "Kniebeugen")
                ])
            ]),
            Training(name: "Mein alter Plan", workouts: [
                Workout(name: "Push", exercises: [
                    Exercise(name: "Bankdrücken"),
                    Exercise(name: "Liegestützen")
                ])
            ])
        ]
    }

    func checkIfTrainingIsReady() {
        print("Trainings: \(self.trainings.count)")
        for t in 0..<self.trainings.count {
            if (self.trainings[t].workouts != nil) {
                print("Training \(self.trainings[t].name) has workouts")
                for w in 0..<self.trainings[t].workouts!.count {
                    if (self.trainings[t].workouts![w].exercises != nil) {
                        print("Training \(self.trainings[t].workouts![w].name) has exervices")
                        self.trainings[t].ready = true
                    }
                }
            }
        }
    }

}

每一次新的训练,锻炼和练习都会更新appState.trainings,它会运行checkIfTrainingIsReady()。到现在为止还挺好。但是该函数本身使用self.trainings[t].ready = true更新appState.trainings,从而一次又一次地调用自身....

0 个答案:

没有答案