Skip to content

Instantly share code, notes, and snippets.

@lightsprint09
Created May 15, 2017 19:23
Show Gist options
  • Save lightsprint09/8c31c366f07ea61394d2020d92ca5578 to your computer and use it in GitHub Desktop.
Save lightsprint09/8c31c366f07ea61394d2020d92ca5578 to your computer and use it in GitHub Desktop.
import Foundation
struct Event<T> {
let key: String
}
extension Event {
var notificationName: Notification.Name {
return Notification.Name(key)
}
}
protocol TypedNotificationDispatching {
func register<T>(for: Event<T>, _: @escaping (T) -> Void) -> NSObjectProtocol
func emit<T>(_ :Event<T>, withPayload: T)
}
extension NotificationCenter: TypedNotificationDispatching {
func register<T>(for event: Event<T>, _ callback: @escaping (T) -> Void) -> NSObjectProtocol {
return addObserver(forName: event.notificationName, object: nil, queue: .main, using: { notification in
callback(notification.object as! T)
})
}
func emit<T>(_ event: Event<T>, withPayload payload: T) {
post(name: event.notificationName, object: payload)
}
}
//Usage
struct Login {
let token: String
}
extension Event where T == Login {
static var onLogin: Event<Login> {
return Event(key: "weakLoginKey")
}
}
var typedNotificationCenter = NotificationCenter.default
typedNotificationCenter.register(for: .onLogin, { login in
//Handle login
//print(login.token)
})
typedNotificationCenter.emit(.onLogin, withPayload: Login(token: "token")) // emit login event
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment