1. AsyncSubject
AsyncSubject 将在源 Observable 产生完成事件后,发出最后一个元素(仅仅只有最后一个元素),如果源 Observable 没有发出任何元素,只有一个完成事件。那 AsyncSubject 也只有一个完成事件。
它会对随后的观察者发出最终元素。如果源 Observable 因为产生了一个 error 事件而中止, AsyncSubject 就不会发出任何元素,而是将这个 error 事件发送出来。
/* AsyncSubject 将在源 Observable 产生完成事件后,发出最后一个元素(仅仅只有最后一个元素),如果源 Observable 没有发出任何元素,只有一个完成事件。那 AsyncSubject 也只有一个完成事件。 它会对随后的观察者发出最终元素。如果源 Observable 因为产生了一个 error 事件而中止, AsyncSubject 就不会发出任何元素,而是将这个 error 事件发送出来。 */ func setupAsyncSubject() { let subject = AsyncSubject<String>() subject .subscribe { print("AsyncSubject 1 Event :",$0) } .disposed(by: disposeBag) subject.onNext("🐶") subject.onNext("🐥") subject.onNext("🐍") subject.onNext("🐯") subject.onCompleted() }
输出:
AsyncSubject 1 Event : next(🐯) AsyncSubject 1 Event : completed
2. PublishSubject
PublishSubject 将对观察者发送订阅后产生的元素,而在订阅前发出的元素将不会发送给观察者。如果你希望观察者接收到所有的元素,你可以通过使用 Observable 的 create 方法来创建 Observable,或者使用 ReplaySubject。
如果源 Observable 因为产生了一个 error 事件而中止, PublishSubject 就不会发出任何元素,而是将这个 error 事件发送出来。
/* PublishSubject 将对观察者发送订阅后产生的元素,而在订阅前发出的元素将不会发送给观察者。如果你希望观察者接收到所有的元素,你可以通过使用 Observable 的 create 方法来创建 Observable,或者使用 ReplaySubject。 如果源 Observable 因为产生了一个 error 事件而中止, PublishSubject 就不会发出任何元素,而是将这个 error 事件发送出来。 */ func setupPublishSubject() { let subject = PublishSubject<String>() subject .subscribe {print("PublishSubject 1 Event: ", $0)} .disposed(by: disposeBag) subject.onNext("🐶") subject.onNext("🐥") subject .subscribe {print("PublishSubject 2 Event: ", $0)} .disposed(by: disposeBag) subject.onNext("🐍") subject.onNext("🐯") subject.onCompleted() }
输出:
PublishSubject 1 Event: next(🐶) PublishSubject 1 Event: next(🐥) PublishSubject 1 Event: next(🐍) PublishSubject 2 Event: next(🐍) PublishSubject 1 Event: next(🐯) PublishSubject 2 Event: next(🐯) PublishSubject 1 Event: completed PublishSubject 2 Event: completed
3. ReplaySubject
ReplaySubject 将对观察者发送全部的元素,无论观察者是何时进行订阅的。
这里存在多个版本的 ReplaySubject,有的只会将最新的 n 个元素发送给观察者,有的只会将限制时间段内最新的元素发送给观察者。
如果把 ReplaySubject 当作观察者来使用,注意不要在多个线程调用 onNext, onError 或 onCompleted。这样会导致无序调用,将造成意想不到的结果。
/* ReplaySubject 将对观察者发送全部的元素,无论观察者是何时进行订阅的。 这里存在多个版本的 ReplaySubject,有的只会将最新的 n 个元素发送给观察者,有的只会将限制时间段内最新的元素发送给观察者。 如果把 ReplaySubject 当作观察者来使用,注意不要在多个线程调用 onNext, onError 或 onCompleted。这样会导致无序调用,将造成意想不到的结果。 */ func setupReplaySubject() { /// Creates new instance of `ReplaySubject` that replays at most `bufferSize` last elements of sequence. /// /// - parameter bufferSize: Maximal number of elements to replay to observer after subscription. /// - returns: New instance of replay subject. let subject = ReplaySubject<String>.create(bufferSize: 1) subject .subscribe{print("ReplaySubject 1 Event: ", $0)} .disposed(by: disposeBag) subject.onNext("🐶") subject.onNext("🐥") subject .subscribe{ print("ReplaySubject 2 Event: ", $0)} .disposed(by: disposeBag) subject.onNext("🐍") subject.onNext("🐯") }
输出:
ReplaySubject 1 Event: next(🐶) ReplaySubject 1 Event: next(🐥) ReplaySubject 2 Event: next(🐥) ReplaySubject 1 Event: next(🐍) ReplaySubject 2 Event: next(🐍) ReplaySubject 1 Event: next(🐯) ReplaySubject 2 Event: next(🐯)
4. BehaviorSubject
/* 当观察者对 BehaviorSubject 进行订阅时,它会将源 Observable 中最新的元素发送出来(如果不存在最新的元素,就发出默认元素)。然后将随后产生的元素发送出来。 如果源 Observable 因为产生了一个 error 事件而中止, BehaviorSubject 就不会发出任何元素,而是将这个 error 事件发送出来。 */ func setupBehavioreSubject() { let subject = BehaviorSubject(value: "🏀") subject .subscribe{ print("BehaviorSubject 1 Event: ", $0)} .disposed(by: disposeBag) subject.onNext("🐶") subject.onNext("🐥") subject .subscribe{ print("BehaviorSubject 2 Event: ", $0)} .disposed(by: disposeBag) subject.onNext("🅰️") subject.onNext("🅱️") subject .subscribe{ print("BehaviorSubject 3 Event: ", $0)} .disposed(by: disposeBag) subject.onNext("🍎") subject.onNext("🍐") }
输出:
BehaviorSubject 1 Event: next(🏀) BehaviorSubject 1 Event: next(🐶) BehaviorSubject 1 Event: next(🐥) BehaviorSubject 2 Event: next(🐥) BehaviorSubject 1 Event: next(🅰️) BehaviorSubject 2 Event: next(🅰️) BehaviorSubject 1 Event: next(🅱️) BehaviorSubject 2 Event: next(🅱️) BehaviorSubject 3 Event: next(🅱️) BehaviorSubject 1 Event: next(🍎) BehaviorSubject 2 Event: next(🍎) BehaviorSubject 3 Event: next(🍎) BehaviorSubject 1 Event: next(🍐) BehaviorSubject 2 Event: next(🍐) BehaviorSubject 3 Event: next(🍐)