Skip to content

Instantly share code, notes, and snippets.

@anthonyvitocuaderno
Last active June 26, 2018 09:14
Show Gist options
  • Save anthonyvitocuaderno/9203faffc0a900b8e23d28d03770f33f to your computer and use it in GitHub Desktop.
Save anthonyvitocuaderno/9203faffc0a900b8e23d28d03770f33f to your computer and use it in GitHub Desktop.
Prototype lightweight event bus for iOS swift 3.3
//
// EventBus.swift
// R2S
//
// Created by Vito Cuaderno on 6/1/18.
// Copyright © 2018 Total Integrated Resources. All rights reserved.
//
import Foundation
final class EventBus {
static let sharedInstance = EventBus()
typealias handlerClosure = (_ value:AnyObject) -> Void
/**
Singleton
*/
private init() {}
/**
Abstract class
extend to create custom events
sample:
let subscription = EventBus.sharedInstance.subscribe(to: "sample event") { value in
let value = value as! BaseViewController
printD(value)
}
let event = EventBus.Event("sample event")
EventBus.sharedInstance.register(event: event)
event.emit(self)
_ = subscription.unsubscribe()
event.emit(self)
EventBus.sharedInstance.unregister(event: event)
event.emit(self)
*/
fileprivate var events = [Event]()
fileprivate var subscribers = [Subscriber]()
class Subscriber {
init(for eventName:String, handler:@escaping handlerClosure) {
self.eventName = eventName
self.handler = handler
}
fileprivate let id = EventBus.sharedInstance.generateId()
fileprivate var eventName = ""
fileprivate var handler:handlerClosure?
final func unsubscribe() -> Bool {
EventBus.sharedInstance.subscribers = EventBus.sharedInstance.subscribers.filter{ $0.id != self.id}
return true
}
}
class Event {
fileprivate let id = EventBus.sharedInstance.generateId()
var name = ""
init(_ name:String) {
self.name = name
}
/**
execute all event handlers of subscribers from registered events
*/
final func emit(_ value:AnyObject) {
if (EventBus.sharedInstance.events.filter{ $0.id == self.id }.count > 0) {
EventBus.sharedInstance.subscribers.forEach{
if $0.eventName == self.name {
$0.handler?(value)
}
}
} else {
printE("Event: \(name) is not registered.")
}
}
}
final func generateId() -> Int {
return Int(Date().timeIntervalSince1970)
}
func register(event:Event) {
if (events.filter{ $0.id == event.id }.count <= 0) {
events.append(event)
}
}
func unregister(event:Event) {
events = events.filter{ $0.id != event.id }
}
final func subscribe(to eventName:String, handler: @escaping handlerClosure ) -> Subscriber {
let subscriber = Subscriber(for: eventName, handler: handler)
self.subscribers.append(subscriber)
return subscriber
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment