RxSwift 小记-Connectable Operators(publish,replay,multicast)

RxSwift 小记-Connectable Operators(publish,replay,multicast)_第1张图片

(*useful)标记:目前觉得有用的函数
//FIXME 标记:待补充

连接:

Connectable Observable在订阅时不发射事件消息,而是仅当调用它们的connect()方法时才发射消息

无Connect的demo:

func sampleWithoutConnectableOperators() {
    printExampleHeader(#function)
    
    let interval = Observable.interval(1, scheduler: MainScheduler.instance)
    
    _ = interval
        .subscribe(onNext: { print("Subscription: 1, Event: \($0)") })
    
    delay(5) {
        
        _ = interval
            .subscribe(onNext: { print("Subscription: 2, Event: \($0)") })
    }
}

打印:
--- sampleWithoutConnectableOperators() example ---
Subscription: 1, Event: 0
Subscription: 1, Event: 1
Subscription: 1, Event: 2
Subscription: 1, Event: 3
Subscription: 1, Event: 4
Subscription: 1, Event: 5
Subscription: 2, Event: 0 // Subscription: 2 有新的订阅就会开始Emit,从0开始
Subscription: 1, Event: 6
Subscription: 2, Event: 1
Subscription: 1, Event: 7
Subscription: 2, Event: 2
Subscription: 1, Event: 8
Subscription: 2, Event: 3
Subscription: 1, Event: 9
Subscription: 2, Event: 4
Subscription: 1, Event: 10
Subscription: 2, Event: 5

publish:Converts the source Observable sequence into a connectable sequence

func sampleWithPublish() {
    printExampleHeader(#function)
    
    let intSequence = Observable.interval(1, scheduler: MainScheduler.instance)
        .publish()
    
    _ = intSequence
        .subscribe(onNext: { print("Subscription 1:, Event: \($0)") })
    
    delay(2) { _ = intSequence.connect() }  //注释了connect timer的就不会执行
    
    delay(4) {
        _ = intSequence
            .subscribe(onNext: { print("Subscription 2:, Event: \($0)") })
    }
    
    delay(6) {
        _ = intSequence
            .subscribe(onNext: { print("Subscription 3:, Event: \($0)") })
    }
}

(*useful)

重点 重点 重点!!!

: connect()是启动 //注释了connect timer的就不会执行

打印:
--- sampleWithPublish() example ---
Subscription 1:, Event: 0
Subscription 1:, Event: 1
Subscription 2:, Event: 1 // Subscription 2: connect推迟了2s,这里的4s就相当于2s
Subscription 1:, Event: 2
Subscription 2:, Event: 2
Subscription 1:, Event: 3
Subscription 2:, Event: 3
Subscription 3:, Event: 3 // Subscription 3: connect推迟了2s,这里的6s就相当于4s
Subscription 1:, Event: 4
Subscription 2:, Event: 4
Subscription 3:, Event: 4
Subscription 1:, Event: 5
。。。

replay

每个新订阅都会replay固定次数的emit(bufferSize)类似ReplaySubject
func sampleWithReplayBuffer() {
    printExampleHeader(#function)
    
    let intSequence = Observable.interval(1, scheduler: MainScheduler.instance)
        .replay(3)
    
    _ = 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)") })
    }
}

打印:
--- sampleWithReplayBuffer() example ---
Subscription 1:, Event: 0
Subscription 2:, Event: 0 //FIXME 这里直接就开始???
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 1:, Event: 4
Subscription 2:, Event: 4
Subscription 3:, Event: 2 // Subscription 3: connect推迟了8s,这里的8s就相当于6s
Subscription 3:, Event: 3 |
Subscription 3:, Event: 4 //这里replay了3次,从4replay到2
Subscription 1:, Event: 5
Subscription 2:, Event: 5
Subscription 3:, Event: 5
Subscription 1:, Event: 6
Subscription 2:, Event: 6
Subscription 3:, Event: 6
Subscription 1:, Event: 7
Subscription 2:, Event: 7
Subscription 3:, Event: 7
。。。

multicast: 通过指定的Subject广播

func sampleWithMulticast() {
    printExampleHeader(#function)
    
    let subject = PublishSubject()
    
    _ = subject
        .subscribe(onNext: { print("Subject: \($0)") })
    
    let intSequence = Observable.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)") })
    }
}

打印:
--- sampleWithMulticast() example ---
Subject: 0
Subscription 1:, Event: 0
Subject: 1
Subscription 1:, Event: 1
Subscription 2:, Event: 1 // Subscription 2: connect推迟了2s,这里的4s就相当于2s
Subject: 2
Subscription 1:, Event: 2
Subscription 2:, Event: 2
Subject: 3
Subscription 1:, Event: 3
Subscription 2:, Event: 3
Subscription 3:, Event: 3 // Subscription 3: connect推迟了2s,这里的6s就相当于4s
Subject: 4
Subscription 1:, Event: 4
Subscription 2:, Event: 4
Subscription 3:, Event: 4
Subject: 5
Subscription 1:, Event: 5
Subscription 2:, Event: 5
Subscription 3:, Event: 5
。。。

你可能感兴趣的:(RxSwift 小记-Connectable Operators(publish,replay,multicast))