问题描述
我正在尝试构建一个计时器,该计时器从15秒开始,倒计时到0。
问题是我想根据事件将计时器更新2秒以上。
这是我到目前为止尝试做的:
struct viewmodel {
struct Input {
let add_time: Observable<Void>
}
struct Output {
let current_time: Observable<String>
let timer_over: Observable<Void>
}
private let current_time = BehaviorRelay(value: 15)
private let timer_over = PublishSubject<Void>()
func transform(input: Input) -> Output {
let current_time = self.current_time
.flatMapLatest { time in
Observable<Int>
.timer(.seconds(0),period: .seconds(1),scheduler: MainScheduler.instance)
.take(self.current_time.value + 1)
.map { "\(self.current_time.value - $0)" }
.do(onCompleted: { self.timer_over.onNext(()) })
}
return Output(
current_time: current_time,timer_over: timer_over
)
}
}
let disposeBag = disposeBag()
let add_time_subject = PublishSubject<Void>()
let input = viewmodel.Input(
add_time: add_time_subject.asObservable()
)
let output = viewmodel().transform(input: input)
output.current_time
.subscribe(onNext: { (time) in
print(time)
})
.disposed(by: disposeBag)
output.timer_over
.subscribe(onNext: {
print("timer_over")
})
.disposed(by: disposeBag)
问题是,当我运行add_time_subject.onNext(())
时,我只想将计时器还没有达到0秒就将计时器更新2秒。
我应该怎么做?
解决方法
您想要实现的目标听起来像是状态机。
您可以通过将计时器操作拆分为实际的“操作”并根据触发器进行合并来实现(一个是手动的“加两秒”,另一个是自动的“减少一秒钟”)。
我还没有对它进行全面测试,但这可能是一个很好的起点:
Mmy solution was:
specify --template-file in sam build
run sam deploy without --template-file option