TimerもCombineに対応しています。Timerで定期的に実行される処理をCombineを使って設定出来るようになっています。
この記事ではTimerの処理をCombineで行う方法についてです。
Combineが初めての方は、次の記事もご覧ください。
[clink url=”https://www.rk-k.com/archives/3937″]
Combineを使って処理を書く
TimerからPublisherを取得して、Subscriberと接続します。この点はNotificationと組み合わせる場合と同じです。
しかし、以下の違いがあります。
- Timerのpublishメソッドはスタティックメソッドであり、インスタンスメソッドではない
- Timer.PublisherはConnectablePublisherになっている
コードで確認してみます。
ユースケース
次のような処理を行いたいと思います。
- 0.1秒ごとに日時をラベルに表示する
- ラベルに表示する処理はCombineを使って書く
実装したコード例
import UIKit
import Combine
class ViewController: UIViewController {
@IBOutlet var dateLabel: UILabel!
var updateLabelCancellable: AnyCancellable?
override func viewDidLoad() {
super.viewDidLoad()
// Combineでタイマーを作る
updateLabelCancellable = Timer
.publish(every: 0.1, on: .main, in: .common)
.autoconnect()
.sink(receiveValue: { (date) in
// 表示する文字列を作って表示する
let formatter = DateFormatter()
formatter.dateStyle = .none
formatter.timeStyle = .medium
self.dateLabel.text = formatter.string(from: date)
})
}
}
autoconnectメソッド
ConnectablePublisherなので、Subscriberが呼ばれるためには、connectメソッドかautoconnectメソッドで明示的に接続する必要があります。
Appleのリファレンスではautoconnect()メソッドを使っていたので、同じくautoconnectメソッドを使いました。
ConnetablePublisherは、データが生まれて、データフローができるタイミングが、CombineのPublisherとSubscriberのタイミングとは別のタイミングであるときに、使用するようです。