合并一种类型的可观察对象,然后链接到另一种类型的可观察对象

Merge observables on one type and then chain to obserbable of another type

是否有链接不同类型的 Observable 的解决方案? 我想要 merge 个 Observable,当每个 Observable 发送 Completed 事件时,发出下一个 Observable (signal)。

类似于 ReactiveCocoathen

let signal = Observable<String>.create { observer in
    observer.onCompleted()
    return Disposables.create()
}

let signals: [Observable<Int>] = [Observable.just(1), Observable.just(2), Observable.just(3)]

Observable.from(signals).merge().concat(signal).subscribe {
    print("completed")
}

需要知道 Element 的类型,所以你有几个我能想到的选项:

  1. 类型AnyIntString都可以。
  2. IntString 添加协议一致性,这可以公开您要在它们上使用的通用接口。
  3. 将类型设置为 enum,其中包含 IntString 的大小写。

下面是每个选项的实现:

Any:

let withAny = PublishSubject<Any>()

withAny.subscribe(onNext: { print([=10=]) })
    .addDisposableTo(disposeBag)

withAny.onNext(1)
withAny.onNext("a")

1
a

有些 protocol:

protocol SomeProtocol {
    // put whatever interface from the elements in here
}
extension String : SomeProtocol {}
extension Int : SomeProtocol {}

let withProtocol = PublishSubject<SomeProtocol>()

withProtocol.subscribe(onNext: { print([=11=]) })
    .addDisposableTo(disposeBag)

withProtocol.onNext(2)
withProtocol.onNext("b")

2
b

有些 enum:

enum SomeEnum {
    case int(Int)
    case str(String)
}

let withEnum = PublishSubject<SomeEnum>()

withEnum.subscribe(onNext: { print([=12=]) })
    .addDisposableTo(disposeBag)

withEnum.onNext(.int(3))
withEnum.onNext(.str("c"))

int(3)
str("c")

我通过 takeLast(1) 实现了这个,然后 flatMap 到需要的 Observable。