合并一种类型的可观察对象,然后链接到另一种类型的可观察对象
Merge observables on one type and then chain to obserbable of another type
是否有链接不同类型的 Observable 的解决方案?
我想要 merge
个 Observable,当每个 Observable 发送 Completed
事件时,发出下一个 Observable (signal
)。
类似于 ReactiveCocoa
的 then
。
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
的类型,所以你有几个我能想到的选项:
- 类型
Any
,Int
和String
都可以。
- 向
Int
和 String
添加协议一致性,这可以公开您要在它们上使用的通用接口。
- 将类型设置为
enum
,其中包含 Int
和 String
的大小写。
下面是每个选项的实现:
与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。
是否有链接不同类型的 Observable 的解决方案?
我想要 merge
个 Observable,当每个 Observable 发送 Completed
事件时,发出下一个 Observable (signal
)。
类似于 ReactiveCocoa
的 then
。
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
的类型,所以你有几个我能想到的选项:
- 类型
Any
,Int
和String
都可以。 - 向
Int
和String
添加协议一致性,这可以公开您要在它们上使用的通用接口。 - 将类型设置为
enum
,其中包含Int
和String
的大小写。
下面是每个选项的实现:
与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。