一定時間後に1度だけ処理を実行したいときや、定期的に何かしらの処理を実行したい場合に活躍するTimer。ここではSwiftが提供しているTimerクラスの基本的な使い方について解説します。
Timerを使うことができれば、状態の監視であったり、一定時間後に通知を挙げたりといったことが簡単にできるので、ぜひマスターしておきましょう。
Timerのコード例
まずは細かな説明の前に全体像を把握するため、コード例を載せておきます。(説明を簡単にするためエラー処理等を省いています)
Timerは基本的に2つの使い方があります。クロージャを使う場合と関数を使う場合です。
クロージャの場合
import Foundation
class ExampleTimer {
private var myTimer: Timer
let interval_func = { (time:Timer) in
print("interval_func")
}
init() {
myTimer = Timer.scheduledTimer(withTimeInterval: 5,
repeats: true,
block: self.interval_func)
}
}
クロージャなので、当然下記のようにすることもできます。
import Foundation
class ExampleTimer {
private var myTimer: Timer
init() {
myTimer = Timer.scheduledTimer(withTimeInterval: 5,
repeats: true,
block:
{ (time:Timer) in
print("interval_func")
}
)
}
}
関数の場合
import Foundation
class ExampleTimer {
private var myTimer: Timer!
@objc private func interval_func() {
print("interval_func")
}
init() {
myTimer = Timer.scheduledTimer(timeInterval:5,
target:self,
selector:#selector(self.interval_func),
userInfo:nil,
repeats:true)
}
}
timeIntervalに "5" を設定しているので5秒毎に "interval_func" が実行されるようになります。たったこれだけで定期実行できるので便利ですね。
Timerの代表的なI/F
ここからはコード例で使ったI/Fの詳細な説明をします。また、コード例では紹介しませんでしたが、よく使うであろうI/Fについても例を挙げながら紹介します。
func scheduledTimer()
起動周期などを設定してTimerのインスタンスを生成するI/Fです。コード例でも使っているI/Fですね。これだけ覚えていれば、とりあえず周期的な処理や一定時間後に処理を実行させることができます。
このI/Fはクロージャを使う場合と関数を使う場合があります。それぞれの使い方は以下の通り。
クロージャーの場合
引数 | 内容 |
---|---|
withTimeInterval interval: TimeInterval | タイマーの間隔 |
repeats: Bool | 繰り返しの真偽 |
block: @escaping (Timer) -> Void | クロージャ |
戻り値:Timerオブジェクト
設定した情報を元に生成したTimerのオブジェクトが返ってきます。返ってきたオブジェクトを使ってTimerの状態をチェックしたり、要求を出したりできます。
myTimer = Timer.scheduledTimer(withTimeInterval: 5,
repeats: true,
block:
{ (time:Timer) in
print("interval_func")
}
)
関数の場合
引数 | 内容 |
---|---|
timeInterval ti: TimeInterval | タイマーの間隔 |
target aTarget: Any | タイマーからメッセージ受信するオブジェクト |
selector aSelector: Selector | タイマーからメッセージ受信した際に処理する関数 |
userInfo: Any? | ユーザー定義の情報を設定 |
repeats yesOrNo: Bool | 繰り返しの真偽 |
戻り値:Timerオブジェクト
設定した情報を元に生成したTimerのオブジェクトが返ってきます。返ってきたオブジェクトを使ってTimerの状態をチェックしたり、要求を出したりできます。
myTimer = Timer.scheduledTimer(timeInterval:5,
target:self,
selector:#selector(self.関数名),
userInfo:nil,
repeats:true)
例ではinit(コンストラクタ)でタイマーをセットしていますが、別に任意の場所で構いません。
func fire()
設定したTimerに対して、設定した時間を待たずに起動するためのI/Fです。
何かしらの理由でタイマーにセットした処理を強制的に起動させたい場合に使います。引数、戻り値はありません。
myTimer.fire()
今まで解説したTimerの設定例ではインターバル時間を5秒に設定しているため、初回呼び出しは5秒後になります。
しかし、初回はタイマー設定直後に呼び出して欲しい場合などは、タイマーを設定した直後に fire() を呼び出すと良いわけです。
func invalidate()
設定したTimerを止めるためのI/Fです。また、Timerのオブジェクトも削除されるため、invalidateしたTimerは再利用はできません。引数、戻り値はありません。
myTimer.invalidate()
var isValid: Bool
設定したTimerの有効/無効を確認するためのI/Fです。値がtrueであれば有効、falseであれば無効となります。
if myTimer.isValid {
/* 有効時の処理 */
} else {
/* 無効時の処理 */
}
var fireDate: Date
設定したTimerが次に起動する時間を確認するためのI/Fです。次の起動がいつになるかを知りたい時に使います。
print(myTimer.fireDate)
var timeInterval: TimeInterval
設定したTimerの起動周期を確認するためのI/Fです。
print(myTimer.timeInterval)
var userInfo: Any?
Timerに設定したuserInfoを取得するためのI/Fです。scheduledTimer()でuserInfoに何かしらを入れたときに、このI/Fを使ってその情報を取得します。
userInfoの情報はユーザー定義なのでコード例はありません。
Timer利用の基本的なシーケンス
Timerを使う流れとしては、大体こんな感じになります。
- scheduledTimer() でタイマーを登録
- 登録したタイマーによって処理が実行される
- 不要になったタイミングで invalidate() してタイマーを停止&削除
まとめ
Timerを使うとアプリの幅が広がります。とても簡単に使えるので、ぜひマスターしておきたいスケジューリングフレームワークですね。
コメント