📝

一定時間後に任意の処理を実行する方法

2022/07/03に公開

背景

私の通っているプログラミングスクールの課題の1つに、「電子ケトルロジックの作成」というものがあった。その中で、「お湯が沸いたら通知する」という機能を実装したが、その際に「水の量に応じてお湯が沸くまでの時間を定義し、その時間が経過した後に自動でprint文を表示する」という方法をとった。

実装方法

結論から言うと、DispatchQueueクラスのasyncAfter(deadline: DispatchTime, execute: DispatchWorkItem)メソッドを使用すればよい。今回はワークアイテムは必要ではなく、print文を呼ぶだけなので、下記のコードの中にしたい処理を書けば解決である。

DispatchQueue.main.asyncAfter(deadline: .now() + 任意の時間) {
}

実際に課題で記述したコードは以下の通りである。

class ElectricKettleLogic {
    
    var inputedWater: Double = 0.0 //L
    var hotWater: Double = 0.0 //L
    var timeToBoil: Double = 0.0 //秒
    
    //水を入れる
    func inputWater(water: Double) {
        inputedWater = water
        print("\(inputedWater)Lの水が入りました")
    }
    
    //お湯をわかす(時間が経ったら通知する)
    func boilWater() {
        timeToBoil = floor((inputedWater / 0.1) * 2)
        print("\(timeToBoil)秒後にお湯が沸きます")
        DispatchQueue.main.asyncAfter(deadline: .now() + timeToBoil) {
            print("お湯が沸きました")
        }
    }
    
    //お湯を注ぐ
    func pourBoiledWater(boiledWater: Double) {
        if boiledWater > inputedWater {
            print("お湯が足りません。")
        } else {
            inputedWater -= boiledWater
            print("お湯が注がれました。残り\(floor(inputedWater))Lです。")
        }
    }
}

解釈

公式のドキュメントには、「DispatchQueueとは、アプリのメインスレッドやバックグラウンドスレッドでタスクの連続実行や同時実行を管理するオブジェクト」とのことだった。その中のasyncAfter(deadline: DispatchTime, execute: DispatchWorkItem)は、指定された時刻にワークアイテムを実行するように予定することができるメソッドである。
DispatchQueueクラスは、他にも様々なメソッドがあるので、また色々試してみたいと思う。

Discussion