Код в блоке onAppear
работает только один раз, когда появляется View
(или несколько раз, когда вид исчезает и появляется снова). В вашем случае waitingTimerCount
всегда будет 0. Если вам нужно наблюдать какое-то значение из представления, используйте onReceive
. Код должен выглядеть следующим образом:
struct TimerWaiter: View {
@ObservedObject var observed = WaitingTimerClass()
var body: some View {
Text("\(self.observed.waitingTimerCount)")
.onAppear {
self.observed.start()
}
.onReceive(observed.$waitingTimerCount) { count in
guard count == 3 else { return }
self.observed.stop()
}
}
}
обновление для первого комментария автора: я не могу понять, почему сброс таймера не работает, как ожидалось, и у меня не так много времени сегодня , Может быть, завтра это будет легче понять. Вот не совсем хорошее, но сработавшее решение:
class WaitingTimerClass: ObservableObject {
@Published var waitingTimerCount: Int = 0
var didInvalidate = PassthroughSubject<Void, Never>()
var waitingTimer = Timer()
func start() {
self.waitingTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in self.waitingTimerCount += 1 } }
func stop() { waitingTimer.invalidate() }
func reset() {
waitingTimer.invalidate()
waitingTimerCount = 0
didInvalidate.send()
}
}
struct TimerWaiter: View {
@ObservedObject var observed = WaitingTimerClass()
@State private var count = 0
var body: some View {
Text("\(count)")
.onAppear {
self.observed.start()
}
.onReceive(observed.$waitingTimerCount) { count in
self.count = count
guard count == 3 else { return }
self.observed.reset()
}
.onReceive(observed.didInvalidate) { _ in
self.count = 0
}
}
}
PS Я попытаюсь покопаться глубже, чтобы понять, почему последнее изменение waitingTimerCount
не влияет на View