Last active
June 26, 2018 09:14
-
-
Save anthonyvitocuaderno/9203faffc0a900b8e23d28d03770f33f to your computer and use it in GitHub Desktop.
Prototype lightweight event bus for iOS swift 3.3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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