Subjects
同时充当了 Observer
和 Observable
的角色, 既是可被监听的序列也是观察者
有许多 UI 控件都存在这种特性,例如UITextField 的当前文本,UISwitch 的开关状态,UISegmentedControl 的选中索引号,UIDatePicker 的选中日期等等。
常见的 Subject
:
AsyncSubject
一个AsyncSubject只在原始Observable完成后,发射来自原始Observable的最后一个值,如果源 Observable 没有发出任何元素,只有一个完成事件。
如果原始的Observable因为发生了错误而终止,AsyncSubject将不会发射任何数据,只是简单的向前传递这个错误通知。
PublishSubject
PublishSubject 将对观察者发送订阅后产生的元素,而在订阅前发出的元素将不会发送给观察者。
如果源 Observable 因为产生了一个 error 事件而中止, PublishSubject 就不会发出任何元素,而是将这个 error 事件发送出来。
ReplaySubject
ReplaySubject 将对观察者发送全部的元素,无论观察者是何时进行订阅的。
BehaviorSubject
当观察者对 BehaviorSubject 进行订阅时,它会将源 Observable 中最新的元素发送出来(如果不存在最新的元素,就发出默认元素)。然后将随后产生的元素发送出来。
如果源 Observable 因为产生了一个 error 事件而中止, BehaviorSubject 就不会发出任何元素,而是将这个 error 事件发送出来。
Variable
在 Swift 中我们经常会用 var 关键字来声明变量。RxSwift 提供的 Variable
实际上是 var
的 Rx
版本,你可以将它看作是 RxVar
。
Variable
其实就是对BehaviorSubject
的封装,所以它也必须要通过一个默认的初始值进行创建。Variable
具有BehaviorSubject
的功能,能够向它的订阅者发出上一个event
以及之后新创建的event
。- 不同的是,
Variable
还把会把当前发出的值保存为自己的状态。同时它会在销毁时自动发送.complete
的event
,不需要也不能手动给Variables
发送completed
或者error
事件来结束它。 - 简单地说就是
Variable
有一个value
属性,我们改变这个value
属性的值就相当于调用一般Subjects
的onNext()
方法,而这个最新的onNext()
的值就被保存在value
属性里了,直到我们再次修改它。 Variables
本身没有subscribe()
方法,但是所有Subjects
都有一个asObservable()
方法。我们可以使用这个方法返回这个Variable
的Observable
类型,拿到这个Observable
类型我们就能订阅它了。
代码示例:
// 在 ViewController 中
let model: Variable<Model?> = Variable(nil)
override func viewDidLoad() {
super.viewDidLoad()
model.asObservable()
.subscribe(onNext: { [weak self] model in
self?.updateUI(with: model)
})
.disposed(by: disposeBag)
model.value = getModel()
}
func updateUI(with model: Model?) { ... }
func getModel() -> Model { ... }