Observable & Observer 既是可监听序列也是观察者

Posted liuxiaokun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Observable & Observer 既是可监听序列也是观察者相关的知识,希望对你有一定的参考价值。

Observable & Observer 既是可监听序列也是观察者

有一部分非常特别的序列。它们既是可监听序列也是观察者

textField的当前文本。它可以看成是由用户输入,而产生的一个文本序列。也可以是由外部文本序列,来控制当前显示内容的观察者:

// 作为可监听序列
let observable = textField.rx.text
observable.subscribe(onNext: { text in show(text: text) })
// 作为观察者
let observer = textField.rx.text
let text: Observable<String?> = ...
text.bind(to: observer)

有许多 UI 控件都存在这种特性,例如:switch的开关状态,segmentedControl的选中索引号,datePicker的选中日期等等。

另外,框架里面定义了一些辅助类型,它们既是可监听序列也是观察者。

  • AsyncSubject
  • PublishSubject
  • ReplaySubject
  • BehaviorSubject
  • ControlProperty

AsyncSubject

AsyncSubject 将在源 Observable 产生完成事件后,发出最后一个元素(仅仅只有最后一个元素),如果源 Observable 没有发出任何元素,只有一个完成事件。那 AsyncSubject 也只有一个完成事件。

它会对随后的观察者发出最终元素。如果源 Observable 因为产生了一个 error 事件而中止, AsyncSubject 就不会发出任何元素,而是将这个 error 事件发送出来。

let disposeBag = DisposeBag()
let subject = AsyncSubject<String>()

subject
  .subscribe { print("Subscription: 1 Event:", $0) }
  .disposed(by: disposeBag)

subject.onNext("??")
subject.onNext("??")
subject.onNext("??")
subject.onCompleted()

技术图片

PublishSubject

技术图片

PublishSubject 将对观察者发送订阅后产生的元素,而在订阅前发出的元素将不会发送给观察者。如果希望观察者接收到所有的元素,可以通过使用 Observable 的 create 方法来创建 Observable,或者使用 ReplaySubject。

技术图片

如果源 Observable 因为产生了一个 error 事件而中止, PublishSubject 就不会发出任何元素,而是将这个 error 事件发送出来。

let disposeBag = DisposeBag()
let subject = PublishSubject<String>()

subject
  .subscribe { print("Subscription: 1 Event:", $0) }
  .disposed(by: disposeBag)

subject.onNext("??")
subject.onNext("??")

subject
  .subscribe { print("Subscription: 2 Event:", $0) }
  .disposed(by: disposeBag)

subject.onNext("???")
subject.onNext("???")

技术图片

以上是关于Observable & Observer 既是可监听序列也是观察者的主要内容,如果未能解决你的问题,请参考以下文章

Java_观察者模式(Observable和Observer) -转

我们啥时候应该使用 Observer 和 Observable?

我们什么时候应该使用Observer和Observable?

Java中使用Observer接口和Observable类实践Observer观察者模式

rxjs系列 -- Observale与Observer

java中观察者模式Observable和Observer