RxSwift-启动和更新倒数计时器

问题描述

我正在尝试构建一个计时器,该计时器从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