Emcee

Форк
0
/
BaseAutomaticTerminationController.swift 
57 строк · 1.6 Кб
1
import AtomicModels
2
import DateProvider
3
import Dispatch
4
import Foundation
5
import EmceeLogging
6
import Timer
7

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

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.