シェンタの日記

swift,python,ubuntu等の記事を緩く書いていきます😜

RxSwiftで一定時間ごとに何らかの処理を行う

 お久しぶりです。今回はRxSwiftを用いて一定時間ごとに処理をするというコードを書いてみましたので、自分のメモ用に残しておきます。


ViewModel

import UIKit
import RxSwift
import RxCocoa
    
final class hogeViewModel {

    private let bag = DisposeBag()

    let startTimer = PublishSubject<Void>()
    let stopTimer = PublishSubject<Void>()

    let timer$: Observable<Int>

    init() {

        timer$ = Observable
            .of(
                startTimer.map { true },
                stopTimer.map { false }
            )
            .merge()
            .flatMapLatest { starts -> Observable<Int> in
                return starts ? Observable<Int>.interval(3.0, scheduler: MainScheduler.instance) : .empty()
            }
            .startWith(0)
            .share(replay: 1)

    }

    
}

ViewController

    
import UIKit
import RxSwift
import RxCocoa

final class hogeViewController: UIViewController {

    private let bag = DisposeBag()

    fileprivate private(set) var vm = hogeViewModel()

    override func viewDidLoad() {
        super.viewDidLoad()

       vm
            .timer$
            .subscribe(onNext: { [weak self] _ in
                guard let wself = self else { return }
                 // 一定時間毎にしたい処理
            })
            .disposed(by: bag)
    }


    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        vm.startTimer.onNext(())

    }

    override func viewDidDisappear(_ animated: Bool) {
        vm.stopTimer.onNext(())
    }

まとめ

特に大した事はないですがこんな感じです!
簡単に説明させてもらうと、boolを使ってtrueならObservable.interval(3.0, scheduler: MainScheduler.instance) を返して、3秒毎にイベントを発火しているという感じです。

最近はRxSwiftをゴリゴリ使って開発しているので、これからもRxSwiftについての記事を色々かけたら良いなと思っています。笑
今回の記事はちょっと適当気味ですいません。。笑
どっかのタイミングでWebApiClientかライブラリを作れたら良いな〜