本文是示例主要来自于官方的实例代码,可从这里下载 ,实例代码稍有改动。其中的图片来自于reactivex.io/
本文主要的作用是查看实例代码并查看对应实例代码的效果,不需要运行项目
操作符目录
- RxSwift官方使用示例之<创建和订阅Observables>
- RxSwift官方使用示例之<使用Subjects>
- RxSwift官方使用示例之<组合操作符>
- RxSwift官方使用示例之<转换操作符>
- RxSwift官方使用示例之<过滤及条件操作符>
- RxSwift官方使用示例之<数学和聚合操作符>
- RxSwift官方使用示例之<可连接操作符>
- RxSwift官方使用示例之<错误处理操作符>
debug 操作符会打印所有的 subscriptions, events, disposals
公用代码,之后的代码中会用到
public func delay(_ delay: Double, closure: @escaping () -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
closure()
}
}
interval
创建一个每隔一段时间发送元素的Observable
序列
let interval = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
_ = interval
.subscribe(onNext: { print("Subscription: 1, Event: \($0)") })
delay(2) {
_ = interval
.subscribe(onNext: { print("Subscription: 2, Event: \($0)") })
}
打印
Subscription: 1, Event: 0
Subscription: 1, Event: 1
Subscription: 1, Event: 2
Subscription: 2, Event: 0
Subscription: 1, Event: 3
Subscription: 2, Event: 1
Subscription: 1, Event: 4
注意第2个订阅者收到事件是在第2秒,并且是从0开始计数
publish
把源Observable
序列转换成一个可连接(contactable)序列
有图可知,
publish
的序列在connect
之后,会对订阅者发送数据,并且是发送订阅后序列产生的新数据
let intSequence = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
.publish() // 转为可连接序列
_ = intSequence
.subscribe(onNext: { print("Subscription 1:, Event: \($0)") })
delay(2) { _ = intSequence.connect() } // 开始连接,连接之后下一秒开始对已订阅者 Subscription 1 发送数据
delay(4) {
_ = intSequence
.subscribe(onNext: { print("Subscription 2:, Event: \($0)") })
}
delay(6) {
_ = intSequence
.subscribe(onNext: { print("Subscription 3:, Event: \($0)") })
}
打印
Subscription 1:, Event: 0
Subscription 1:, Event: 1
Subscription 2:, Event: 1
Subscription 1:, Event: 2
Subscription 2:, Event: 2
Subscription 1:, Event: 3
Subscription 2:, Event: 3
Subscription 3:, Event: 3
Subscription 1:, Event: 4
Subscription 2:, Event: 4
Subscription 3:, Event: 4
...
replay
将源 Observable
序列转换为可连接序列,并将重发之前发送的 bufferSize 数量的元素给每个新订阅者
let intSequence = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
.replay(5) // 最多重发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)") })
}
打印(// 之后是分析
)
Subscription 1:, Event: 0 // 第3秒打印
Subscription 2:, Event: 0 // 第4秒打印,先把缓存的数据0给新订阅者 Subscription 2
Subscription 1:, Event: 1 // 依次给订阅者1、2发送数据1
Subscription 2:, Event: 1
Subscription 1:, Event: 2 // 第5秒打印,给订阅者1、2发送数据2
Subscription 2:, Event: 2
Subscription 1:, Event: 3 // 第6秒打印,给订阅者1、2发送数据3
Subscription 2:, Event: 3
Subscription 1:, Event: 4 // 第7秒打印,给订阅者1、2发送数据4
Subscription 2:, Event: 4
Subscription 3:, Event: 0 // 第8秒打印,先把缓存的数据 01234 给新订阅者 Subscription 3
Subscription 3:, Event: 1
Subscription 3:, Event: 2
Subscription 3:, Event: 3
Subscription 3:, Event: 4
Subscription 1:, Event: 5 // 然后再给订阅者1、2、3发送数据5
Subscription 2:, Event: 5
Subscription 3:, Event: 5
Subscription 1:, Event: 6 // 第9秒打印,给订阅者1、2、3发送数据6
Subscription 2:, Event: 6
Subscription 3:, Event: 6
...
multicast
将源 Observable
序列转换为可连接序列,并通过指定订阅者广播数据
let subject = PublishSubject<Int>()
_ = subject
.subscribe(onNext: { print("Subject: \($0)") })
let intSequence = Observable<Int>.interval(.seconds(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)") })
}
打印
Subject: 0
Subscription 1:, Event: 0
Subject: 1
Subscription 1:, Event: 1
Subscription 2:, Event: 1
Subject: 2
Subscription 1:, Event: 2
Subscription 2:, Event: 2
Subject: 3
Subscription 1:, Event: 3
Subscription 2:, Event: 3
Subscription 3:, Event: 3
...