読者です 読者をやめる 読者になる 読者になる

RxSwiftでリアクティブにインターバルを変更できるタイマーを作る

Swift RxSwift

タイトルの通りです。
以下の記事が参考になりました。

RxSwiftでリアクティブにインターバル間隔を変えるintervalを作る方法 #rxSwift

コードは以下のようになります。

func createAdjustableTimer(interval: Observable<RxTimeInterval>) -> Observable<RxTimeInterval> {
    return Observable.create { observer in
        var intervalDisposer: Disposable?
        
        return interval.subscribeNext { newInterval in
            intervalDisposer?.dispose()
            intervalDisposer = Observable<Int>
                .interval(newInterval, scheduler: MainScheduler.instance)
                .subscribeNext { count in
                    observer.onNext(newInterval)
                }
        }
    }
}

上の例ではインターバルを表す型として RxTimeInterval を使っていますが、RxTimeInterval = NSTimeInterval = Double なので、実際はどれでもOKです。

また、最初の値を送り出すまでの時間を変えたい場合は interval の代わりに timer を使えばよいです。

extension Observable where Element : SignedIntegerType {

    public class func timer(dueTime: RxSwift.RxTimeInterval, period: RxSwift.RxTimeInterval, scheduler: SchedulerType) -> RxSwift.Observable<Element>

}