美文网首页
RxSwift 小记-Connectable Operators

RxSwift 小记-Connectable Operators

作者: sdupidBoby | 来源:发表于2018-05-28 15:29 被阅读14次

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

    连接:

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

    无Connect的demo:

    func sampleWithoutConnectableOperators() {
        printExampleHeader(#function)
        
        let interval = Observable<Int>.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<Int>.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<Int>.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<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)") })
        }
    }
    
    

    打印:
    --- 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

          本文链接:https://www.haomeiwen.com/subject/uspyjftx.html