RxSwift

来源:互联网 发布:yy网络主播天佑 编辑:程序博客网 时间:2024/05/13 04:03

Publish and connect()

对于Publish操作符的使用,可以看之前文章。这里简单说明publish可以将一个普通序列转换成Connectable Observable序列.
注意: Connectable Observable跟一般的观察者序列很相似,但是当被订阅之后不会立马发送事件, 仅仅是在connect()操作符被调用之后才会发送事件消息。(A connectable Observable resembles an ordinary Observable, except that it does not begin emitting items when it is subscribed to, but only when the Connect operator is applied to it. In this way you can prompt an Observable to begin emitting items at a time of your choosing.)

        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只有在被订阅之后才产生通知。我们可以看官方的一个对比表:



Publish and refcount()

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()操作符



原创粉丝点击