前言

本篇文章将要学习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 ObservableRxSwift中包括了:

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,或者replaySubjectbehaviorSubject等。不同的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)") })
}

致谢

如果发现有错误的地方,欢迎评论,感谢!

最新文章

  1. SQL Server 通过重建方式还原 master 数据库
  2. SQL编程
  3. Linux系统上通知网关更新arp
  4. inotify +rsync进行实时同步
  5. Golang tips
  6. cat -n与nl的区别
  7. kdump failed
  8. JPA学习---第七节:使用JPA加载_更新_删除对象
  9. python中执行javascript代码
  10. android 15 activity跳转
  11. 今天愉快的hack小记
  12. rsyslog 读日志文件 ,当rsyslog 中断时,也会丢数据
  13. IOS学习之路十四(用TableView做的新闻客户端展示页面)
  14. Shell变量:Shell变量的定义、删除变量、只读变量、变量类型
  15. Spring data Redis
  16. 微信公众平台开发,图文回复、access_token生成调用、以及微信SDK的实现(2)
  17. FLIR 相机采集程序
  18. bittorrent 学习(三) MSG
  19. Sublime Text3 安装 markdownediting插件 报错 Error loading syntax file &quot;Packages/Markdown/Markdown.tmLanguage&quot;:
  20. ml机器学习笔记

热门文章

  1. File System Implementation 文件系统设计实现
  2. hihocoder1415 后缀数组三&#183;重复旋律3
  3. 【BZOJ】3091: 城市旅行 Link-Cut Tree
  4. 在Windows下安装MongoDB
  5. 【译】DTD - Entities
  6. 天梯赛 L2-012 关于堆的判断 (二叉树)
  7. CentOS7最小化安装连接到网络的解决方案
  8. kendo method:destroy 解决有些在kendo.all.js 的js 库里报错问题
  9. 自动化测试===adb 解锁手机的思路
  10. cpu几种架构区别