Emcee

Форк
0
/
EventBus.swift 
38 строк · 930.0 Байт
1
import CLTExtensions
2
import Dispatch
3
import Foundation
4

5
public final class EventBus {
6
    private var streams = [EventStream]()
7
    private let lock = NSLock()
8
    private let eventDeliveryQueue = DispatchQueue(label: "ru.avito.EventBus.eventDeliveryQueue")
9
    
10
    public init() {}
11
    
12
    public func add(stream: EventStream) {
13
        lock.whileLocked {
14
            streams.append(stream)
15
        }
16
    }
17
    
18
    public func post(event: BusEvent) {
19
        lock.whileLocked {
20
            streams.forEach { stream in
21
                eventDeliveryQueue.async {
22
                    stream.process(event: event)
23
                }
24
            }
25
        }
26
    }
27
    
28
    public func uponDeliveryOfAllEvents(work: @escaping () -> ()) {
29
        eventDeliveryQueue.async {
30
            work()
31
        }
32
    }
33
    
34
    public func tearDown() {
35
        post(event: .tearDown)
36
        eventDeliveryQueue.sync(flags: .barrier) {}
37
    }
38
}
39

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

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

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

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