<接続可能なオペレーター>のRxSwift公式使用例

この記事の例は、主に公式のサンプルコードからのものであり、ここからダウンロードできます。サンプルコードは少し変更されています。写真はreactivex.io/からのものです

この記事の主な機能は、プロジェクトを実行せずに、サンプルコードを表示し、対応するサンプルコードの効果を表示することです。

オペレーターディレクトリ

デバッグオペレーターは、すべてのサブスクリプション、イベント、廃棄を出力します

後続のコードで使用される共通コード

public func delay(_ delay: Double, closure: @escaping () -> Void) {
    DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
        closure()
    }
}

間隔

Observable定期的に要素を送信するシーケンスを作成しますimage.png

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ソースシーケンスを連絡可能なシーケンスに変換しますimage.png

図から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の要素数を新しいサブスクライバーごとに再送信しますimage.png

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
...

おすすめ

転載: juejin.im/post/7118727129944047652