# RxSwift ---- Asynchronous Events in Cocoa * Target-Action * NSNotificationCenter * Key-Value Observing * Delegates * Callback Closures --- ### One ring to rule them all(sequences) `Observable
` --- ### Sequence event type ``` enum Event
{ case Next(Element) case Error(ErrorType) case Completed } ``` --- ### Creating a sequence ``` let o = Observable.create { observer in observer.on(.Next("Hello world!")) observer.on(.Completed) return NopDisposable.instance } ``` --- ### Subscribe ``` protocol ObservableType { func subscribe(on: (event: Event) -> Void) -> Disposable func subscribe( onNext: ((Self.E) -> Swift.Void)? = default, onError: ((Error) -> Swift.Void)? = default, onCompleted: (() -> Swift.Void)? = default, onDisposed: (() -> Swift.Void)? = default) -> Disposable } ``` --- ### Observable demo ``` Observable.create { observer in observer.onNext("Hello world!") observer.onCompleted() return NopDisposable.instance }.subscribe { event in print(event) } // outputs: // Next(Hello world!) // Completed ``` --- ### Sequence operators * map * flatMap * filter * throttle * merge * combineLatest --- ### [map](http://reactivex.io/documentation/operators/map.html) ``` let disposeBag = DisposeBag() let formatter = NumberFormatter() formatter.numberStyle = .spellOut Observable
.of(123, 4, 56) .map { formatter.string(from: $0) ?? "" } .subscribe(onNext: { print($0) }) .addDisposableTo(disposeBag) ``` --- ### Bindings ```swift self.button.rx.tap .withLatestFrom(segmentedControl.rx.value) .map { selectedIndex in return "You've selected #\(selectedIndex)." } .subscribe { message in print(message) } .addDisposableTo(disposeBag) ``` --- ### KVO ```swift view.rx.observe(CGRect.self, "frame") .subscribe(onNext: { frame in print("Got new frame \(frame)") }).disposed(by: disposeBag) ``` --- ### Notifications ``` NotificationCenter.default .rx.notification(NSNotification.Name.UITextViewTextDidBeginEditing, object: myTextView) .map { /*do something with data*/ } ```