Simple typesafe EventHub in Swift using callbacks/listeners defined by generic types.
struct CounterEvent: Event {
let currentCount: Int
}
let eventHub = EventHub(queue: .global())
eventHub.subscribe { (event: CounterEvent)
print(event.currentCount) // => 5
}
eventHub.trigger(CounterEvent(currentCount: 5))
struct SomeErrorEvent: Event {
let message: String
let code: Int
}
class NotifyAdminListener: Listener<SomeErrorEvent> {
override func handle(event: SomeErrorEvent) {
print("Oh no! We got error \(error.code) with the message '\(error.message)'")
}
}
let eventHub = EventHub(queue: .global())
eventHub.subscribe(NotifyAdminListener())
eventHub.trigger(SomeErrorEvent(message: "Fatal and dangerous error", code: 500))
- Import the library
import SwiftEventHub
- Initialize the EventHub class on a
DispatchQueue
. Add theEventHub
to a global scope (e.g. shared instance), for cross-events/listeners, or use it in an internal scope
let hub = EventHub(queue: .global())
- Define events by making them comply to the
Event
protocol
struct MyEvent: Event {}
- Subscribe to the events either by callback or listener (see examples above)
hub.subscribe { (event: MyEvent) in
// Do something with the event
}
- Trigger events by calling the method
.trigger(event: Event)
hub.trigger(MyEvent())
-
The events triggered are distributed to all listeners attached to the hub, listening for that specific event.
-
To unsubscribe, the returned UUID from the
.subscribe
method, can be used
let subscription = hub.subscribe { // ... }
hub.unsubscribe(subscription)
Swift 4.1
With CocoaPods:
pod 'SwiftEventHub'