Notificationz :satellite:

Helping you own NotificationCenter

Version Version Swift Platforms Carthage

## Highlights + __Keep Your Naming Conventions:__
This library gives you convenient access to `NotificationCenter`, but it's up to you to set it up the way you like! + __Nothing to Hide:__
Not trying to hide `NotificationCenter` functionality. Just an attempt to provide a more convenient API + __Full and Simple Testing:__
Testing this library was simple, since it only forwards calls to `NotificationCenter` for the most part. Mocking that object allowed tests to reach 100% coverage. ## Features You can try them in the playground shipped with the framework! __Use your own naming convention to wrap NotificationCenter__ ```swift let nsCenter = NotificationCenter.default let 📡 = NotificationCenterAdapter(notificationCenter: nsCenter) 📡.post(.💃) // my personal preference, define this in Globals.swift let NC = NotificationCenterAdapter(notificationCenter: nsCenter) // Now, you can use `NC` throughout the app ``` __Four simple keywords to remember__ ```swift let obj = Object() NC.add(obj, selector: #selector(Object.call)) // normal add observer NC.observe { notification in } // observe using blocks NC.post(.tenhut) // post a notification NC.remove(obj) // remove from nsCenter ``` __Transparent and convenient API__ ```swift let keys = ["observe", "many", "keys"].map { Notification.Name($0) } NC.observe(keys) { _ in } // observe on the same thread NC.observeUI(keys) { _ in } // delivered to the main thread NC.post(.test) NC.post(.test, userInfo: ["info":5]) NC.post(Notification(name: .test, object: nil)) ``` __RAII-based observers__ ```swift class Dummy { // declare the observer as optional var broadcastObserver: Observer? init() { // assign it anywhere you like broadcastObserver = NC.observe { [unowned self] _ in self.doSomething() }.execute() // this is a neat bonus feature } func doSomething() { // exectued twice, since we call "execute" manually print("it works!") } } var dummy: Dummy? = Dummy() NC.post(.test) // calls doSomething dummy = nil // clean up is automatic NC.post(.test) // doesn't crash! ``` ## Getting Started ### Carthage [Carthage][carthage-link] is fully supported. Simply add the following line to your [Cartfile][cartfile-docs]: ```ruby github "SwiftKitz/Notificationz" ``` ### Cocoapods [Cocoapods][cocoapods-link] is fully supported. Simply add the following line to your [Podfile][podfile-docs]: ```ruby pod 'Notificationz' ``` ### Submodule For manual installation, you can grab the source directly or through git submodules, then simply: + Drop the `Notificationz.xcodeproj` file as a subproject (make sure `Copy resources` is __not__ enabled) + Navigate to your root project settings. Under "Embedded Binaries", click the "+" button and select the `Notificationz.framework` ## Motivation After migrating to Swift, the `NotificationCenter` APIs really stood out in the code. Writing so much boiler plate all over the place just to register, handle, and cleanup notifications. Coming from C++, RAII seemed a pretty invaluable pattern to be applied here. With this framework, one can easily declare all their observers as properties: ```swift class Sample { private var keyboardObserver: Observer? private var reachabilityObserver: Observer? } ``` Other programmers should be pleased with this consistency! Moreover, there is no need to worry handling notifications in some other function somewhere nor do cleanup in `deinit`. It just works: ```swift keyboardObserver = NC.observeUI(UIKeyboardWillShowNotification) { [unowned self] _ in // you can write your handler code here, maybe call another function } // you can force cleanup by setting the property to nil, but don't have to keyboardObserver = nil ``` ## Author Maz ([@Mazyod](http://twitter.com/mazyod)) ## License Notificationz is released under the MIT license. See LICENSE for details. [carthage-link]: https://github.com/Carthage/Carthage [cartfile-docs]: https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfile [cocoapods-link]: https://cocoapods.org/ [podfile-docs]: https://guides.cocoapods.org/syntax/podfile.html