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
订阅的时候把对应的响应放进对应的闭包里。
订阅的序列有两种类型:
- 冷序列:只有观察者订阅这个序列的时候,才会发送事件,比如上面代码中Observable。
- 热序列:不管有没有观察者订阅,都会发送事件,比如按钮的点击,不管有没有观察者,只要用户点击了,都会发送点击事件。
总结
Rx其实很简单,就是一个观察者模式的应用,Observable发送事件,observer订阅事件,收到相应的事件作出相应的处理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。