参考git
RxSwift中文文档github
Github RxSwiftmarkdown
AsyncSubject 将在源 Observable 产生完成事件后,发出最后一个元素(仅仅只有最后一个元素),若是源 Observable 没有发出任何元素,只有一个完成事件。那 AsyncSubject 也只有一个完成事件。oop
它会对随后的观察者发出最终元素。若是源 Observable 由于产生了一个 error 事件而停止, AsyncSubject 就不会发出任何元素,而是将这个 error 事件发送出来。spa
/*
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
复制代码
PublishSubject 将对观察者发送订阅后产生的元素,而在订阅前发出的元素将不会发送给观察者。若是你但愿观察者接收到全部的元素,你能够经过使用 Observable 的 create 方法来建立 Observable,或者使用 ReplaySubject。code
若是源 Observable 由于产生了一个 error 事件而停止, PublishSubject 就不会发出任何元素,而是将这个 error 事件发送出来。orm
/*
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()
}
复制代码
输出:server
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
复制代码
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(🐯)
复制代码
/*
当观察者对 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(🍐)
复制代码