若是是iOS程序員,那麼你們確定熟悉action-target模式、delegate模式或者通知(notification),這些模式基本都是用來解決事件響應的問題,action-target就不用說了,UIButton就是基於這個模式來響應事件的,delegate也是同樣的,好比說UIAlertViewDelegate,這個協議定義了不少UIAlertView事件響應的回調方法,Notification有點區別,它是採用訂閱-通知的方式,而且能夠有多個響應的對象。react
Rx全名是ReactiveX,是一個函數響應式框架,遵循Functional Reactive Programming(FRP)的設計規範,它把事件封裝成信號流,並採用觀察者模式來實現。git
先來看個簡單的例子,這裏是demo工程,下載到本地,用XCode打開,點擊按鈕的時候,能夠看到輸出了"HelloWorld!",打開RxSwiftViewController文件,看按鈕響應的那段代碼。程序員
@objc func onClicked(_ sender: Any?) { let observable = Observable<String>.create { (observer) -> Disposable in observer.on(Event.next("HelloWorld!")) observer.onCompleted() return Disposables.create() } let disposeBag = DisposeBag() observable.subscribe(onNext: { (str) in print(str) }, onError: { (error) in }, onCompleted: { }).disposed(by: disposeBag) }
在方法裏面先定義了一個Observable對象,這個叫可觀察序列(後面會解釋),這個對象是能夠訂閱的,至關於觀察者模式中的被觀察者,subscribe即是它的訂閱方法,當調用subscribe的時候,會觸發observer.on(Event.next("next"))和observer.onCompleted()的執行,而且會在onNext和onCompleted中響應,因此就打印出了"HelloWorld!"。github
這裏是最簡單的狀況,實際運用中會碰到更復雜的狀況,不過別小心,先把簡單的理解透了,複雜的就好理解了。閉包
可觀察序列,也就是能發送一些事件流的事物,什麼是事件流?最多見的按鈕的連續點擊即是一個事件流。框架
可觀察序列能夠發送三種類型的事件:一、發送數據(Next),二、遇到問題(Error),三、發送完成(Completed)。好比上面的例子,observable發送了一個Next事件「observer.on(Event.next("HelloWorld!"))」以及一個Completed事件「observer.onCompleted()」。當遇到錯誤的時候,還能夠發送Error事件。函數
事件的定義以下,是個枚舉設計
public enum Event<Element> { /// Next element is produced. case next(Element) /// Sequence terminated with an error. case error(Swift.Error) /// Sequence completed successfully. case completed }
觀察者能夠訂閱序列的事件。好比上面的代碼裏的subscribe。原型以下:code
func subscribe(onNext: ((Self.E) -> Swift.Void)? = default, onError: ((Error) -> Swift.Void)? = default, onCompleted: (() -> Swift.Void)? = default, onDisposed: (() -> Swift.Void)? = default) -> Disposable
訂閱的時候把對應的響應放進對應的閉包裏。server
訂閱的序列有兩種類型:
Rx其實很簡單,就是一個觀察者模式的應用,Observable發送事件,observer訂閱事件,收到相應的事件做出相應的處理。