SwiftEventBus
Allows publish-subscribe-style communication between components without requiring the components to explicitly be aware of each other
Features
- simplifies the communication between components
 - decouples event senders and receivers
 - avoids complex and error-prone dependencies and life cycle issues
 - makes your code simpler
 - is fast
 - is tiny
 - Thread-safe
 
Installation
Cocoapods
pod 'SwiftEventBus', :tag => '5.1.0', :git => 'https://github.com/cesarferreira/SwiftEventBus.git' 
Carthage
github "cesarferreira/SwiftEventBus" == 5.1.0 
Versions
5.+forswift 53.+forswift 4.22.+forswift 31.1.0forswift 2.2
Usage
1 - Prepare subscribers
Subscribers implement event handling methods that will be called when an event is received.
SwiftEventBus.onMainThread(target, name: "someEventName") { result in
    // UI thread
}
// or
SwiftEventBus.onBackgroundThread(target, name:"someEventName") { result in
    // API Access
} 
2 - Post events
Post an event from any part of your code. All subscribers matching the event type will receive it.
SwiftEventBus.post("someEventName") 
--
Eventbus with parameters
Post event
SwiftEventBus.post("personFetchEvent", sender: Person(name:"john doe")) 
Expecting parameters
SwiftEventBus.onMainThread(target, name:"personFetchEvent") { result in
    let person : Person = result.object as Person
    println(person.name) // will output "john doe"
} 
Posting events from the BackgroundThread to the MainThread
Quoting the official Apple documentation:
Regular notification centers deliver notifications on the thread in which the notification was posted
Regarding this limitation, @nunogoncalves implemented the feature and provided a working example:
@IBAction func clicked(sender: AnyObject) {
     count++
     SwiftEventBus.post("doStuffOnBackground")
 }
 @IBOutlet weak var textField: UITextField!
 var count = 0
 override func viewDidLoad() {
     super.viewDidLoad()
     SwiftEventBus.onBackgroundThread(self, name: "doStuffOnBackground") { notification in
         println("doing stuff in background thread")
         SwiftEventBus.postToMainThread("updateText")
     }
     SwiftEventBus.onMainThread(self, name: "updateText") { notification in
         self.textField.text = "\(self.count)"
     }
}
//Perhaps on viewDidDisappear depending on your needs
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    SwiftEventBus.unregister(self)
} 
--
Unregistering
Remove all the observers from the target
SwiftEventBus.unregister(target) 
Remove observers of the same name from the target
SwiftEventBus.unregister(target, "someEventName") 
