RxSwfit 学习笔记(十一)连接操作符publish、connet、replay、refCount

441 阅读1分钟

publish

将 Observable 转换为可被连接的 Observable

publish会将 Observable 转换为可被连接的 Observable。可被连接的 Observable 和普通的 Observable 十分相似,不过在被订阅后不会发出元素,直到 connect 操作符被应用为止。这样一来你可以控制 Observable 在什么时候开始发出元素。

connect

通知 ConnectableObservable 可以开始发出元素了

案例

print("开始计时2秒后发出connect()")
let intSequence = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
    .publish()

intSequence
    .subscribe(onNext: { print("Subscription 1:, Event: \($0)") }).disposed(by: dis)

//延时两秒发送 connect
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
     intSequence.connect().disposed(by: self.dis)
}

DispatchQueue.main.asyncAfter(deadline: .now() + 4) {
    _ = intSequence
        .subscribe(onNext: { print("Subscription 2:, Event: \($0)") })
}

DispatchQueue.main.asyncAfter(deadline: .now() + 6) {
    _ = intSequence
    .subscribe(onNext: { print("Subscription 3:, Event: \($0)") })
}

打印结果:

请注意红字,我们将会和下面的replay进行对比。

replay

确保观察者接收到同样的序列,即使是在 Observable 发出元素后才订阅

可被连接的 Observable 和普通的 Observable 十分相似,不过在被订阅后不会发出元素,直到connect 操作符被应用为止。这样一来你可以控制 Observable 在什么时候开始发出元素。

replay操作符将 Observable 转换为可被连接的 Observable,并且这个可被连接的 Observable 将缓存最新的n 个元素。当有新的观察者对它进行订阅时,它就把这些被缓存的元素发送给观察者。

publish的区别在于replay会将订阅之前的元素一并发出,而publish不会

案例

let intSequence = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
    .replay(5)

_ = intSequence
    .subscribe(onNext: { print("Subscription 1:, Event: \($0)") })

DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
    _ = intSequence.connect()
}

DispatchQueue.main.asyncAfter(deadline: .now() + 4) {
    _ = intSequence
        .subscribe(onNext: { print("Subscription 2:, Event: \($0)") })
}

DispatchQueue.main.asyncAfter(deadline: .now() + 8) {
    _ = intSequence
    .subscribe(onNext: { print("Subscription 3:, Event: \($0)") })
}

打印结果:

refCount

将可被连接的 Observable 转换为普通 Observable

可被连接的 Observable 和普通的 Observable 十分相似,不过在被订阅后不会发出元素,直到 connect 操作符被应用为止。这样一来你可以控制 Observable 在什么时候开始发出元素。

refCount 操作符将自动连接和断开可被连接的 Observable。它将可被连接的 Observable 转换为普通 Observable。当第一个观察者对它订阅时,那么底层的 Observable 将被连接。当最后一个观察者离开时,那么底层的 Observable 将被断开连接。

案例publish的案例。再加上refCount,就又恢复原样。不需要connect()就能发出元素

print("开始计时2秒后发出connect()")
let intSequence = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
    .publish()
    .refCount()

intSequence
    .subscribe(onNext: { print("Subscription 1:, Event: \($0)") }).disposed(by: dis)