【Swift】Timerの基本的な使い方をエンジニアが解説

一定時間後に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を使う流れとしては、大体こんな感じになります。

  1. scheduledTimer() でタイマーを登録
  2. 登録したタイマーによって処理が実行される
  3. 不要になったタイミングで invalidate() してタイマーを停止&削除

まとめ

Timerを使うとアプリの幅が広がります。とても簡単に使えるので、ぜひマスターしておきたいスケジューリングフレームワークですね。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次