Created
July 11, 2018 12:06
-
-
Save stephancill/5a7c3be492bda401415f70814e0ca51e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // | |
| // 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