Skip to content

Instantly share code, notes, and snippets.

@stephancill
Created July 11, 2018 12:06
Show Gist options
  • Save stephancill/5a7c3be492bda401415f70814e0ca51e to your computer and use it in GitHub Desktop.
Save stephancill/5a7c3be492bda401415f70814e0ca51e to your computer and use it in GitHub Desktop.
//
// TimedActionRepeater.swift
//
// Created by Stephan Cilliers on 2018/06/26.
// Copyright © 2018 Stephan Cilliers. All rights reserved.
//
import Foundation
class TimedActionRepeater {
var delegate: TimedActionRepeaterDelegate?
private(set) var repetitions: Int
private(set) var repetitionsCompleted = 0
var repetitionsRemaining: Int {
return max(0, repetitions - repetitionsCompleted)
}
private var timer: Timer!
private var callback: (Int, Bool) -> ()
private var repetitionTime: TimeInterval
private var delayTimer: Timer?
var isActive: Bool {
return timer != nil || delayTimer != nil
}
init(repetitionTime: TimeInterval, repetitions: Int, callback: @escaping (Int, Bool) -> ()) {
self.repetitionTime = repetitionTime
self.callback = callback
self.repetitions = repetitions
}
func start() {
stop()
timer = Timer.scheduledTimer(withTimeInterval: repetitionTime, repeats: true, block: { (timer) in
self.repetitionsCompleted += 1
self.callback(self.repetitionsCompleted, self.repetitionsRemaining == 0)
if self.repetitionsRemaining == 0 {
self.delegate?.timerCompleted()
self.stop()
}
})
}
func startImmediately() {
start()
self.repetitionsCompleted += 1
self.callback(self.repetitionsCompleted, self.repetitionsRemaining == 0)
if self.repetitionsRemaining == 0 {
self.delegate?.timerCompleted()
self.stop()
}
}
func start(after delay: TimeInterval) {
delayTimer = Timer.scheduledTimer(withTimeInterval: delay, repeats: false, block: { (timer) in
self.startImmediately()
})
}
func stop() {
delayTimer?.invalidate()
delayTimer = nil
repetitionsCompleted = 0
if let _ = timer {
self.timer.invalidate()
self.timer = nil
}
}
}
protocol TimedActionRepeaterDelegate {
func timerCompleted()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment