命令の実行を遅らせるには:遅延処理

アプリを作っていると命令の実行を遅らせたい場合が出てきます。例えばUILabelのテキストを一瞬点滅させて目立たせる場合など、多々あります。

命令を遅延させる方法を3つ紹介します。

目次

DispatchQueue

ほとんどの場合私はこれを使います。簡単に確実に命令の実行を遅らすことができます。DispatchQueue内の命令は遅延しますが、他の全ての命令は何事もなく進んでいきます。

DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {

(ここに遅延させたい命令を書きます。+ 0.2 だと0.2秒遅延実行されます。グローバル変数・定数、関数(func)、このDispatchQueueが入るfunc以外で定義されたラベル名などをここに書く場合は、先頭にself.が必要です。つけ忘れてもXcode先生が指摘してくれるので素直に従いましょう)

}

ラベルのテキストを1回点滅(消して0.2秒後に再現)させるコードの例です。UILabelであるLabel1はクラスの中で定義されておりLabel1.textにはテキストが入っています。

let temp:String = Label1.text!
Label1.text = ""
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {   
    self.Label1.text = temp 
}

2回点滅(消して0.2秒後に再現、1秒後に消して0.2秒後に再現)させるコードの例です。DispatchQueueの中にDispatchQueueを書きます。

let temp:String = Label1.text!
Label1.text = ""
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
    self.Label1.text = temp
    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
        self.Label1.text = ""
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
            self.Label1.text = temp
        }
    }
}

perform(#selector

これを使う場合は、遅延処理させる関数を別に設ける必要があります。perform(#selector を適用した命令は遅延しますが、他の全ての命令は何の影響もなく進んでいきます。
perform(#selector を使って DispatchQueue 同様に、ラベルのテキストを1回点滅(消して0.2秒後に再現)させるコードの例を書いてみました。なお、gtempはグローバル変数として定義しました。

gtemp = Label1.text!
Label1.text = ""
perform(#selector(selectorExe), with: nil, afterDelay: 0.2)

そして別に次の関数が必要です。
@objc func selectorExe() {
    self.Label1.text = gtemp 
}

この例の場合だと、DispatchQueueの方がグローバル変数も不要で簡潔で分かりやすいと思います。
perform(#selector を使ったもっと上手なコードがあるかもしれません。

sleep

これは遅延処理ではなくプログラム処理の一時停止です。sleepで一時停止中は全ての命令が止まります。私は使ったことはありませんが、これを使った方が良い場合もあるかもしれません。
1秒停止させるコードの例です。( )内の数字が停止秒数です。

sleep(1)

最後に

遅延処理である DispatchQueue、perform(#selector そして一時停止処理の sleep について説明いたしました。

コメント

コメントする

CAPTCHA


目次