我的应用程序的结构包含训练,锻炼和练习。用户可以在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,从而一次又一次地调用自身....