RxSwift - Publish.connect()和Publish.refcount()的区别

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值