本文为原创文章,转载请标明出处html
一个AsyncSubject只在原始Observable完成后,发射来自原始Observable的最后一个值。它会把这最后一个值发射给任何后续的观察者。swift
let disposeBag = DisposeBag() let subject = AsyncSubject<Int>() subject.onNext(1) subject.subscribe(onNext: { int in print("observerA: \(int)") }, onCompleted: { print("observerA: onCompleted") }).disposed(by: disposeBag) subject.onNext(2) subject.subscribe(onNext: { int in print("observerB: \(int)") }, onCompleted: { print("observerB: onCompleted") }).disposed(by: disposeBag) subject.onNext(3) subject.subscribe(onNext: { int in print("observerC: \(int)") }, onCompleted: { print("observerC: onCompleted") }).disposed(by: disposeBag) subject.onCompleted() subject.onNext(4) subject.subscribe(onNext: { int in print("observerD: \(int)") }, onCompleted: { print("observerD: onCompleted") }).disposed(by: disposeBag)
输出:缓存
observerA: 3 observerB: 3 observerC: 3 observerA: onCompleted observerB: onCompleted observerC: onCompleted observerD: 3 observerD: onCompleted
当观察者订阅BehaviorSubject时,它开始发射原始Observable最近发射的数据,而后继续发射其它任何来自原始Observable的数据。code
let disposeBag = DisposeBag() let subject = BehaviorSubject<Int>(value: 0) subject.onNext(1) subject.subscribe(onNext: { int in print("observerA: \(int)") }, onCompleted: { print("observerA: onCompleted") }).disposed(by: disposeBag) subject.onNext(2) subject.subscribe(onNext: { int in print("observerB: \(int)") }, onCompleted: { print("observerB: onCompleted") }).disposed(by: disposeBag) subject.onNext(3)
输出:server
observerA: 1 observerA: 2 observerB: 2 observerA: 3 observerB: 3
PublishSubject只会把在订阅发生的时间点以后来自原始Observable的数据发射给观察者。htm
let disposeBag = DisposeBag() let subject = PublishSubject<Int>() subject.onNext(0) subject.subscribe(onNext: { int in print("observerA: \(int)") }, onCompleted: { print("observerA: onCompleted") }).disposed(by: disposeBag) subject.onNext(1) subject.subscribe(onNext: { int in print("observerB: \(int)") }, onCompleted: { print("observerB: onCompleted") }).disposed(by: disposeBag) subject.onNext(2)
输出:get
observerA: 1 observerA: 2 observerB: 2
ReplaySubject在缓存增加到必定大小后会丢弃旧的数据,否则会发射全部来自原始Observable的数据给观察者,不管它们是什么时候订阅的。io
let disposeBag = DisposeBag() let subject = ReplaySubject<Int>.create(bufferSize: 3) subject.onNext(1) subject.onNext(2) subject.onNext(3) subject.subscribe(onNext: { int in print("observerA: \(int)") }, onCompleted: { print("observerA: onCompleted") }).disposed(by: disposeBag) subject.onNext(4) subject.subscribe(onNext: { int in print("observerB: \(int)") }, onCompleted: { print("observerB: onCompleted") }).disposed(by: disposeBag) subject.onCompleted() subject.subscribe(onNext: { int in print("observerC: \(int)") }, onCompleted: { print("observerC: onCompleted") }).disposed(by: disposeBag)
输出:class
observerA: 1 observerA: 2 observerA: 3 observerA: 4 observerB: 2 observerB: 3 observerB: 4 observerA: onCompleted observerB: onCompleted observerC: 2 observerC: 3 observerC: 4 observerC: onCompleted