この記事の例は、主に公式のサンプルコードからのものであり、ここからダウンロードできます。サンプルコードは少し変更されています。写真はreactivex.io/からのものです
この記事の主な機能は、プロジェクトを実行せずに、サンプルコードを表示し、対応するサンプルコードの効果を表示することです。
オペレーターディレクトリ
- RxSwiftの公式使用例<Observablesの作成とサブスクライブ>
- RxSwiftの公式使用例<サブジェクトの使用>
- <組み合わせ演算子>のRxSwift公式使用例
- RxSwift公式使用例の<変換演算子>
- RxSwiftの公式使用例<フィルタリングおよび条件演算子>
- RxSwiftの公式使用例<数学および集計演算子>
- <接続可能なオペレーター>のRxSwift公式使用例
- <エラー処理演算子>のRxSwift公式使用例
デバッグオペレーターは、すべてのサブスクリプション、イベント、廃棄を出力します
後続のコードで使用される共通コード
public func delay(_ delay: Double, closure: @escaping () -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
closure()
}
}
間隔
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からカウントを開始することに注意してください。
公開
Observable
ソースシーケンスを連絡可能なシーケンスに変換します
図から
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
...
リプレイ
ソース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)") })
}
print(// 之后是分析
)
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
...
マルチキャスト
ソース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
...