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()操作符
阅读全文
0 0
- RxSwift
- RxSwift
- RxSwift
- RxSwift
- RxSwift
- RxSwift
- RxSwift
- RxSwift
- RxSwift(一)
- RxSwift - API
- RxSwift - Why
- 什么是RxSwift?
- RxSwift学习心得
- RxSwift 教程 学习
- RxSwift使用教程
- iOS MVVM 与 RxSwift
- ReactiveCocoa和RXSwift速查表
- RxSwift 学习指导索引
- 查看文件(或文件夹)被哪个进程使用【文件已在另一程序中打开】
- 全国1977——2016年参加高考人数和录取率
- Linux学习篇第三章之~nfs
- 40条常见的移动端Web页面问题解决方案
- smartsvn 忽略.DS_Store
- RxSwift
- 使用jQuery选择器的优势
- 遍历
- Matlab处理读取ASCII文本数据找到规则需求,重新写入数据到新的文本文件[示例:有限元边界条件施加]
- MVVMLight+WPF
- mysql数据库ibdata1文件瘦身
- 第三十一天 用js写一个可以拖动的div
- Oracle 误删除软件目录
- 多线程synchronized、wait与notify