如何在swift中结合使用反应可可的三个信号?

时间:2018-04-13 10:48:09

标签: swift reactive-cocoa reactive-swift

我已阅读文档,看起来“和”不适合组合信号。然后,我查看了“combineLatest”,但它期望从每个信号返回至少一个值。我的用例是,我有三个独立的信号,它们之间没有任何关系。我只是想将它们完全结合起来并在一个地方进行观察,并在封闭内部进行相应处理。

例如:

Signal1<Int, NoError>
Signal2<String, NoError>
Signal3<SomeType, NoError>

Combine3Signals<(Int, String, SomeType), NoError>.observeValues {...//handle accordingly based on type...}

1 个答案:

答案 0 :(得分:4)

您可以使用Signal.merge,但首先您必须说服编译器您确实要合并这些不同的类型

let p1 = MutableProperty<Int>(1)
let p2 = MutableProperty<Bool>(false)
let p3 = MutableProperty<String>("")

let s1: Signal<Any, NoError> = p1.signal.map { $0 }
let s2: Signal<Any, NoError> = p2.signal.map { $0 }
let s3: Signal<Any, NoError> = p3.signal.map { $0 }

let merged = Signal<Any, NoError>.merge(s1, s2, s3)
merged.observeValues { print($0) }


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