onsen code monkey

個人的な日記とプログラミング備忘録です

【Swift】Timer処理まとめ

Swift4でのTimer処理関連を調べたメモ
モリー解放に気をつける

まずはTimer処理

final class ViewController {

    private var timer: Timer?                           // Timerを保持する変数
    private(set) var timerTotalDuration: TimeInterval = 0    // 総秒数を保持する変数

    func startTimer() {
        // ⑤ Timer のスケジューリング重複を回避
        guard timer == nil else { return }

        // ① Timerのスケジューリングと保持
        timer = Timer.scheduledTimer(
            timeInterval: 5,
            target: self,
            selector: #selector(handleTimer(_:)),
            userInfo: nil,
            repeats: true
        )
    }

    func stopTimer() {
        // ③ Timer のスケジューリングを破棄
        timer?.invalidate()
    }

    func resetTimer() {
        // ④ Timer のスケジューリングを破棄し、総秒数を0に戻す 
        stopTimer()
        timerTotalDuration = 0
    }

    @objc private func handleTimer(_ timer: Timer) {
        // ② Timer の間隔秒を総秒数に加算する
        timerTotalDuration += timer.timeInterval
        print("timer fired. total: \(timerTotalDuration)")
    }
}

View破棄時にTimerのメモリを解放する

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        stopTimer()
    }


参考記事
【Swift】加算型Timer(ストップウォッチみたいな)の作り方 〜Timerの基本的な使い方〜 - Qiita
【Swift】メモリー対策!使ったタイマーは必ずinvalidate() - Qiita
【Swift】Timerの強参照が破棄できない時の対処法(deinit での破棄方法)│RC-Code