`RxSwift` 的倒数计时器

Posted

技术标签:

【中文标题】`RxSwift` 的倒数计时器【英文标题】:countdown timer by `RxSwift` 【发布时间】:2019-09-22 08:01:51 【问题描述】:

我需要一个带有RxSwift 的三十秒计时器。 这是一个重复的问题,但问题没有明确的答案

【问题讨论】:

信息不足。 【参考方案1】:

现有答案的更好方法。

let countDown = 15 // 15 seconds 
Observable<Int>.timer(.seconds(0), period: .seconds(1), scheduler: MainScheduler.instance)
        .take(countDown+1)
        .subscribe(onNext:  timePassed in
            let count = self.countDown - timePassed
            print(count)

        , onCompleted: 
            print("count down complete")
        )

【讨论】:

为什么要在take() +1? @Skoua 用于完成包含 0 的可观察对象。【参考方案2】:

在我看来,这是一个更清洁的解决方案(Swift 5.3)。 onNext 闭包接收剩余时间,因此无需执行计算。这也使得使用takeUntil 运算符在值等于0 时终止订阅变得更加容易。

let countdown = 30
Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
    .map  countdown - $0 
    .takeUntil(.inclusive, predicate:  $0 == 0 )
    .subscribe(onNext:  value in
        print(value)
    , onCompleted: 
        print("completed")
    ).disposed(by: disposeBag)

【讨论】:

【参考方案3】:

使用 5.0 版本的 RxSwift 你可以做到:

    Observable<Int>.interval(.seconds(30), scheduler: MainScheduler.instance).bind  timePassed in

    .disposed(by: yourDisposeBag)

【讨论】:

以上是关于`RxSwift` 的倒数计时器的主要内容,如果未能解决你的问题,请参考以下文章

按秒倒数计时器

动态 Python 倒数计时器

为啥倒数计时器突然执行得很快?

带有 CircularProgressIndicator 的倒数计时器

如何检查可观察倒数计时器是不是已完成?

Flutter:当倒数计时器达到 0 时执行动作