RxSwift官方使用示例之<可连接操作符>

本文是示例主要来自于官方的实例代码,可从这里下载 ,实例代码稍有改动。其中的图片来自于reactivex.io/

本文主要的作用是查看实例代码并查看对应实例代码的效果,不需要运行项目

操作符目录

debug 操作符会打印所有的 subscriptions, events, disposals

公用代码,之后的代码中会用到

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

interval

创建一个每隔一段时间发送元素的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开始计数

publish

把源Observable序列转换成一个可连接(contactable)序列 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
...

replay

将源 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)") })
}

打印(// 之后是分析

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

猜你喜欢

转载自juejin.im/post/7118727129944047652