print("Create observable") let observable = Observable.just("Jack").publish() print("start subscribe") observable.subscribe(onNext: { print("first subscribe = \($0)") }).addDisposableTo(disposeBag) observable.subscribe(onNext: { print("second subscrible = \($0)") }).addDisposableTo(disposeBag) delay(3) { print("Calling connect after 3 seconds") _ = observable.connect() } 执行结果: Create observable start subscribe Calling connect after 3 seconds first subscribe = Jack second subscrible = Jack 由结果可知,在延时3秒之后,执行observable.connect(),才开始发送事件。即订阅者将接收来自观察者序列的事件。如果我们在第二次开始订阅者之前将观察者序列dispose了,那么会出现什么结果呢?
print("create observable and call connect") let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance).publish() _ = observable.connect() print("start subscribe") let firstSubscribe = observable.subscribe(onNext: { print("next = \($0)") }) delay(3) { print("dispose at 3 seconds") firstSubscribe.dispose() } delay(6) { print("subscribe again at 6 seconds") observable.subscribe(onNext: { print("next = \($0)") }).addDisposableTo(self.disposeBag) } 执行结果: create observable and call connect start subscribe next = 0 next = 1 next = 2 dispose at 3 seconds subscribe again at 6 seconds next = 6 next = 7 next = 8 ... 一直执行下去 所以,即使所有的订阅者被dispose了,观察者序列还是活跃的,并且不断的产生事件,行为就像是“hot observeable”.hot observeable将一直产生通知不管是否有订阅。而cold observable只有在被订阅之后才产生通知。我们可以看官方的一个对比表:
refcount()使观察者序列的行为像一个不同的观察者序列。官方解释
RefCount操作符将自动处理可连接观察者序列的连接和断开。它将操作可连接观察者序列并返回一个普通观察者序列。当第一个订阅者订阅这个观察者序列,refcount()会自动调用connect()方法,不需要我们手动调用。RefCount会跟踪有多少订阅者订阅了,并不会断开连接一直到最后一个观察者序列处理完成。
print("create observable") let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance) .publish().refCount() print("start subscribe") let firstSubscribe = observable.subscribe(onNext: { print("next = \($0)") }) delay(3) { print("dispose at 3 seconds") firstSubscribe.dispose() } delay(6) { print("subscribe again at 6 seconds") observable.subscribe(onNext: { print("next = \($0)") }).addDisposableTo(self.disposeBag) } 执行结果: create observable start subscribe next = 0 next = 1 next = 2 dispose at 3 seconds subscribe again at 6 seconds next = 0 next = 1 next = 2 ... 一直执行下去 注意:当我们再一次订阅之后,将会重新开始发送所有事件.功能类似于share()操作符