RxSwift - 入门介绍

什么是Rx

如果是iOS程序员,那么大家肯定熟悉action-target模式、delegate模式或者通知(notification),这些模式基本都是用来解决事件响应的问题,action-target就不用说了,UIButton就是基于这个模式来响应事件的,delegate也是一样的,比如说UIAlertViewDelegate,这个协议定义了很多UIAlertView事件响应的回调方法,Notification有点区别,它是采用订阅-通知的方式,并且可以有多个响应的对象。

Rx全名是ReactiveX,是一个函数响应式框架,遵循Functional Reactive Programming(FRP)的设计规范,它把事件封装成信号流,并采用观察者模式来实现。

例子(HelloWorld!)

先来看个简单的例子,这里是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!"。

这里是最简单的情况,实际运用中会碰到更复杂的情况,不过别当心,先把简单的理解透了,复杂的就好理解了。

可观察序列(Observable)

可观察序列,也就是能发送一些事件流的事物,什么是事件流?最常见的按钮的连续点击便是一个事件流。

可观察序列可以发送三种类型的事件:1、发送数据(Next),2、遇到问题(Error),3、发送完成(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。原型如下:

func subscribe(onNext: ((Self.E) -> Swift.Void)? = default, onError: ((Error) -> Swift.Void)? = default, onCompleted: (() -> Swift.Void)? = default, onDisposed: (() -> Swift.Void)? = default) -> Disposable

订阅的时候把对应的响应放进对应的闭包里。

订阅的序列有两种类型:

  1. 冷序列:只有观察者订阅这个序列的时候,才会发送事件,比如上面代码中Observable。
  2. 热序列:不管有没有观察者订阅,都会发送事件,比如按钮的点击,不管有没有观察者,只要用户点击了,都会发送点击事件。

总结

Rx其实很简单,就是一个观察者模式的应用,Observable发送事件,observer订阅事件,收到相应的事件作出相应的处理。


chenjiang3
138 声望9 粉丝

cocos2d,ios,objective-c,swift,golang,nodejs