Type-safe event handling for Swift
Clone or download
Eduardo Miranda and aleclarson 5.2.1
Latest commit e253f40 Sep 25, 2018
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
EmitterKit.xcodeproj Removes SDKROOT, solves Carthage/Carthage#1547 Oct 17, 2018
EmitterKitSpecs 4.0.0 Jul 5, 2015
src lint Oct 18, 2018
tests fix: make EventListener removal during emit more efficient Feb 7, 2018
.gitignore 3.2.1 May 24, 2015
EmitterKit-Info.plist 5.2.1 Oct 18, 2018
EmitterKit.podspec 5.2.1 Oct 18, 2018
LICENSE v3.1 Feb 17, 2015
README.md 5.2.1 Oct 18, 2018

README.md

emitter-kit v5.2.1

stable CocoaPods Compatible Carthage Compatible Platform

A replacement for NSNotificationCenter#addObserver and NSObject#addObserver that is type-safe and not verbose.

import EmitterKit

// A generic event emitter (but type-safe)!
var event = Event<T>()

// Any emitted data must be the correct type.
event.emit(data)

// This listener will only be called once.
// You are *not* required to retain it.
event.once { data: T in
  print(data)
}

// This listener won't stop listening;
// unless you stop it manually,
// or its Event<T> is deallocated.
// You *are* required to retain it.
var listener = event.on { data: T in
  print(data)
}

// Stop the listener manually.
listener.isListening = false

// Restart the listener (if it was stopped).
listener.isListening = true

Targeting

A target allows you to associate a specific AnyObject with an emit call. This is useful when emitting events associated with classes you can't add properties to (like UIView).

When calling emit with a target, you must also call on or once with the same target in order to receive the emitted event.

let myView = UIView()
let didTouch = Event<UITouch>()

didTouch.once(myView) { touch in
  print(touch)
}

didTouch.emit(myView, touch)

NSNotification

The Notifier class helps when you are forced to use NSNotificationCenter (for example, if you want to know when the keyboard has appeared).

// You are **not** required to retain this after creating your listener.
var event = Notifier(UIKeyboardWillShowNotification)

// Handle NSNotifications with style!
listener = event.on { (notif: Notification) in
  print(notif.userInfo)
}

Key-Value Observation (KVO)

// Any NSObject descendant will work.
var view = UIView()

// "Make KVO great again!" - Donald Trump
listener = view.on("bounds") { (change: Change<CGRect>) in
  print(change)
}

v5.2.1 changelog

  • Fix Carthage compatibility for non iOS platforms

v5.2.0 changelog

  • Added the Event.getListeners method
  • Listeners are now always called in the order they were added
  • Event.emit() can be called without an argument
  • Carthage support has been improved

v5.1.0 changelog

  • The NotificationListener class now takes a Notification instead of an NSDictionary.

  • A NotificationListener without a target will now receive every Notification with its name, regardless of the value of notif.object.

v5.0.0 changelog

  • Swift 3.0 + Xcode 8.0 beta 6 support

  • The Signal class was removed. (use Event<Void> instead)

  • The Emitter abstract class was removed.

  • The EmitterListener class was renamed EventListener<T>.

  • The Event<T> class no longer has a superclass.

  • The Notification class was renamed Notifier (to prevent collision with Foundation.Notification).

  • The on and once methods of Event<T> now return an EventListener<T> (instead of just a Listener)

  • The on and once methods of Notifier now return an NotificationListener (instead of just a Listener)

  • The on and once methods of NSObject now return an ChangeListener<T> (instead of just a Listener)

  • The keyPath, options, and object properties of ChangeListener<T> are now public.

  • A listenerCount: Int computed property was added to the Event<T> class.

  • An event: Event<T> property was added to the EventListener<T> class.

The changelog for older versions can be found here.