如何在 swift 中使用反应式 cocoa 组合三个信号?
How to combine three Signals using reactive cocoa in swift?
我已经阅读了文档,看起来 "and" 不适合组合信号。然后,我查看了 "combineLatest" 但它期望每个信号至少返回一个值。我的用例是我有三个独立的信号,它们之间没有关系。我只想将它们组合在一起并在一个地方观察并在闭包内进行相应处理。
例如:
Signal1<Int, NoError>
Signal2<String, NoError>
Signal3<SomeType, NoError>
Combine3Signals<(Int, String, SomeType), NoError>.observeValues {...//handle accordingly based on type...}
您可以为此使用 Signal.merge
,但首先您必须让编译器相信您确实想要合并这些不同的类型
let p1 = MutableProperty<Int>(1)
let p2 = MutableProperty<Bool>(false)
let p3 = MutableProperty<String>("")
let s1: Signal<Any, NoError> = p1.signal.map { [=10=] }
let s2: Signal<Any, NoError> = p2.signal.map { [=10=] }
let s3: Signal<Any, NoError> = p3.signal.map { [=10=] }
let merged = Signal<Any, NoError>.merge(s1, s2, s3)
merged.observeValues { print([=10=]) }
p1.value = 2
p1.value = 3
p3.value = "Hello"
p2.value = true
没有map
,编译器会报错
error: cannot convert value of type 'Signal<Int, NoError>' to specified type 'Signal<Any, NoError>'
我已经阅读了文档,看起来 "and" 不适合组合信号。然后,我查看了 "combineLatest" 但它期望每个信号至少返回一个值。我的用例是我有三个独立的信号,它们之间没有关系。我只想将它们组合在一起并在一个地方观察并在闭包内进行相应处理。
例如:
Signal1<Int, NoError>
Signal2<String, NoError>
Signal3<SomeType, NoError>
Combine3Signals<(Int, String, SomeType), NoError>.observeValues {...//handle accordingly based on type...}
您可以为此使用 Signal.merge
,但首先您必须让编译器相信您确实想要合并这些不同的类型
let p1 = MutableProperty<Int>(1)
let p2 = MutableProperty<Bool>(false)
let p3 = MutableProperty<String>("")
let s1: Signal<Any, NoError> = p1.signal.map { [=10=] }
let s2: Signal<Any, NoError> = p2.signal.map { [=10=] }
let s3: Signal<Any, NoError> = p3.signal.map { [=10=] }
let merged = Signal<Any, NoError>.merge(s1, s2, s3)
merged.observeValues { print([=10=]) }
p1.value = 2
p1.value = 3
p3.value = "Hello"
p2.value = true
没有map
,编译器会报错
error: cannot convert value of type 'Signal<Int, NoError>' to specified type 'Signal<Any, NoError>'