アプリを作っていると命令の実行を遅らせたい場合が出てきます。例えば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 について説明いたしました。
コメント