🪶

RXSwiftでタイマーを作ってみた

2024/05/23に公開

🤔やってみたいこと

RXSwift + UIKitでタイマーアプリを作ってみるのをやってみたいと思った。タイマーというかカウンターになってしまいましたね😅

🚀やってみたこと

cocoa podsを使っても私は、インストールできなかったので、SPMを使ってインストールしました。

こちらの記事を参考にしてください。
https://zenn.dev/joo_hashi/articles/989bcfdd848513

[sample code]

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    var timer: Observable<Int>?
    var disposeBag = DisposeBag()
    var isTimerRunning = false
    let timerLabel = UILabel()

    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(type: .system)
        button.frame = CGRect(x: 100, y: 100, width: 100, height: 50)
        button.setTitle("Start/Stop", for: .normal)
        view.addSubview(button)

        timerLabel.frame = CGRect(x: 100, y: 200, width: 200, height: 50)
        view.addSubview(timerLabel)

        button.rx.tap
            .subscribe(onNext: { [weak self] in
                guard let self = self else { return }
                if self.isTimerRunning {
                    self.disposeBag = DisposeBag()
                } else {
                    self.timer = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
                    self.timer?
                        .subscribe(onNext: { seconds in
                            print("Elapsed time = \(seconds)")
                            DispatchQueue.main.async {
                                self.timerLabel.text = "Elapsed time = \(seconds)"
                            }
                        })
                        .disposed(by: self.disposeBag)
                }
                self.isTimerRunning = !self.isTimerRunning
            })
            .disposed(by: disposeBag)
    }
}

コードの解説

このコードは、RxSwiftとRxCocoaを使用して、ボタンをタップするたびにタイマーを開始/停止するiOSアプリケーションを作成します。

  1. timer: Observable型の変数。これは、1秒ごとに整数を発行するObservableを保持します。
  2. disposeBag: DisposeBagインスタンス。これは、Observableの購読を管理し、ViewControllerが破棄されるときに自動的に購読を解除します。
  3. isTimerRunning: タイマーが現在実行中かどうかを示すブール値。
  4. timerLabel: タイマーの経過時間を表示するUILabel。

viewDidLoadメソッド内で次のことを行います:

  1. ボタンを作成し、そのタップイベントを購読します。
  2. ボタンがタップされると、isTimerRunningの値に基づいてタイマーを開始または停止します。
  3. タイマーが実行中の場合、新しいDisposeBagを作成して既存の購読を解除します(これによりタイマーが停止します)。
  4. タイマーが実行されていない場合、新しいタイマーObservableを作成し、その値を購読します。これにより、タイマーが開始されます。
  5. タイマーObservableが新しい値を発行するたびに、その値をコンソールに出力し、timerLabelのテキストを更新します。
    このコードは、RxSwiftの基本的な使用法を示しています:Observableを作成し、その値を購読し、DisposeBagを使用して購読のライフサイクルを管理します。また、RxCocoaを使用して、ボタンのタップイベントをObservableとして扱います。

🙂最後に

RXSwiftたまに勉強するのですが、理解するのにわかりやすいサンプルないかな〜と試しているところです。今だと、SwiftUI + Combineなのでしょうけど🥲

Discussion