Emcee
57 строк · 1.6 Кб
1import AtomicModels
2import DateProvider
3import Dispatch
4import Foundation
5import EmceeLogging
6import Timer
7
8internal class BaseAutomaticTerminationController: AutomaticTerminationController {
9internal let dateProvider: DateProvider
10let lastActivityDate: AtomicValue<Date>
11private let handlers = AtomicValue<[AutomaticTerminationControllerHandler]>([])
12private var trackingTimer = DispatchBasedTimer(repeating: .seconds(1), leeway: .seconds(1))
13
14init(dateProvider: DateProvider) {
15self.dateProvider = dateProvider
16lastActivityDate = AtomicValue(dateProvider.currentDate())
17}
18
19var isTerminationAllowed: Bool {
20fatalError("Subclasses must override this method")
21}
22
23func startTracking() {
24updateLastActivityDate()
25trackingTimer.start { [weak self] timer in
26guard let strongSelf = self else {
27timer.stop()
28return
29}
30if strongSelf.isTerminationAllowed {
31timer.stop()
32strongSelf.fireHandlers()
33}
34}
35}
36
37func add(handler: @escaping AutomaticTerminationControllerHandler) {
38handlers.withExclusiveAccess {
39$0.append(handler)
40}
41}
42
43func indicateActivityFinished() {
44updateLastActivityDate()
45}
46
47private func updateLastActivityDate() {
48guard !isTerminationAllowed else { return }
49lastActivityDate.set(dateProvider.currentDate())
50}
51
52private func fireHandlers() {
53for handler in handlers.currentValue() {
54handler()
55}
56}
57}
58