RxSwift 系列(七)
2024-10-06 23:41:58
前言
本篇文章将要学习RxSwift
中连接操作符。Connectable Observable
在订阅时不发射事件消息,而是仅当调用它们的connect()
方法时才发射消息,这样就可以等待所有我们想要的订阅者都已经订阅了以后,再开始发出事件消息,这样能保证我们想要的所有订阅者都能接收到事件消息。其实也就是等大家都就位以后,开始发出消息。
在开始学习Connectable Observable
之前,让我们来看一个non-connectable operator
:
let intervar = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
_ = intervar.subscribe(onNext: {print("subscribe:1, event:\($0)")})
delay(5, closure: { (_) in
_ = intervar.subscribe(onNext: {print("subscribe:2, event:\($0)")})
})
Connectable Observable
在RxSwift
中包括了:
publish
将一个源Observable sequence
转变为一个connectable sequence
。
let intervar = Observable<Int>.interval(1, scheduler: MainScheduler.instance).publish()
_ = intervar.subscribe(onNext: {print("subscribe:1, event:\($0)")})
_ = intervar.subscribe(onNext: {print("subscribe:2, event:\($0)")})
intervar.connect()
你可以试试把intervar.connect()
注释掉,会发现并没有任何响应。
replay
将一个正常的sequence
转换成一个connectable sequence
,然后和replaySubject
相似,能接收到订阅之前的事件消息。
let intSequence = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
.replay(5)
_ = intSequence
.subscribe(onNext: { print("Subscription 1:, Event: \($0)") })
delay(2) { _ = intSequence.connect() }
delay(4) {
_ = intSequence
.subscribe(onNext: { print("Subscription 2:, Event: \($0)") })
}
delay(8) {
_ = intSequence
.subscribe(onNext: { print("Subscription 3:, Event: \($0)") })
}
multicast
将一个正常的sequence
转换成一个connectable sequence
,并且通过特性的subject
发送出去,比如PublishSubject
,或者replaySubject
,behaviorSubject
等。不同的Subject
会有不同的结果。
let subject = PublishSubject<Int>()
_ = subject
.subscribe(onNext: { print("Subject: \($0)") })
let intSequence = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
.multicast(subject)
_ = intSequence
.subscribe(onNext: { print("\tSubscription 1:, Event: \($0)") })
delay(2) { _ = intSequence.connect() }
delay(4) {
_ = intSequence
.subscribe(onNext: { print("\tSubscription 2:, Event: \($0)") })
}
delay(6) {
_ = intSequence
.subscribe(onNext: { print("\tSubscription 3:, Event: \($0)") })
}
致谢
如果发现有错误的地方,欢迎评论,感谢!
最新文章
- SQL Server 通过重建方式还原 master 数据库
- SQL编程
- Linux系统上通知网关更新arp
- inotify +rsync进行实时同步
- Golang tips
- cat -n与nl的区别
- kdump failed
- JPA学习---第七节:使用JPA加载_更新_删除对象
- python中执行javascript代码
- android 15 activity跳转
- 今天愉快的hack小记
- rsyslog 读日志文件 ,当rsyslog 中断时,也会丢数据
- IOS学习之路十四(用TableView做的新闻客户端展示页面)
- Shell变量:Shell变量的定义、删除变量、只读变量、变量类型
- Spring data Redis
- 微信公众平台开发,图文回复、access_token生成调用、以及微信SDK的实现(2)
- FLIR 相机采集程序
- bittorrent 学习(三) MSG
- Sublime Text3 安装 markdownediting插件 报错 Error loading syntax file ";Packages/Markdown/Markdown.tmLanguage";:
- ml机器学习笔记
热门文章
- File System Implementation 文件系统设计实现
- hihocoder1415 后缀数组三&#183;重复旋律3
- 【BZOJ】3091: 城市旅行 Link-Cut Tree
- 在Windows下安装MongoDB
- 【译】DTD - Entities
- 天梯赛 L2-012 关于堆的判断 (二叉树)
- CentOS7最小化安装连接到网络的解决方案
- kendo method:destroy 解决有些在kendo.all.js 的js 库里报错问题
- 自动化测试===adb 解锁手机的思路
- cpu几种架构区别