🪶
RXSwiftでタイマーを作ってみた
🤔やってみたいこと
RXSwift + UIKitでタイマーアプリを作ってみるのをやってみたいと思った。タイマーというかカウンターになってしまいましたね😅
🚀やってみたこと
cocoa podsを使っても私は、インストールできなかったので、SPMを使ってインストールしました。
こちらの記事を参考にしてください。
[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アプリケーションを作成します。
- timer: Observable型の変数。これは、1秒ごとに整数を発行するObservableを保持します。
- disposeBag: DisposeBagインスタンス。これは、Observableの購読を管理し、ViewControllerが破棄されるときに自動的に購読を解除します。
- isTimerRunning: タイマーが現在実行中かどうかを示すブール値。
- timerLabel: タイマーの経過時間を表示するUILabel。
viewDidLoadメソッド内で次のことを行います:
- ボタンを作成し、そのタップイベントを購読します。
- ボタンがタップされると、isTimerRunningの値に基づいてタイマーを開始または停止します。
- タイマーが実行中の場合、新しいDisposeBagを作成して既存の購読を解除します(これによりタイマーが停止します)。
- タイマーが実行されていない場合、新しいタイマーObservableを作成し、その値を購読します。これにより、タイマーが開始されます。
- タイマーObservableが新しい値を発行するたびに、その値をコンソールに出力し、timerLabelのテキストを更新します。
このコードは、RxSwiftの基本的な使用法を示しています:Observableを作成し、その値を購読し、DisposeBagを使用して購読のライフサイクルを管理します。また、RxCocoaを使用して、ボタンのタップイベントをObservableとして扱います。
🙂最後に
RXSwiftたまに勉強するのですが、理解するのにわかりやすいサンプルないかな〜と試しているところです。今だと、SwiftUI + Combineなのでしょうけど🥲
Discussion