0

我有两个来自通知的信号。这些是从外部框架触发的。

let successSignal = NotificationCenter.default.reactive.notifications(forName: NSNotification.Name(rawValue: "someNotification"))
let failedSignal = NotificationCenter.default.reactive.notifications(forName: NSNotification.Name(rawValue: "someNotification"))

现在我想将它们组合成一个类型的信号Signal<Notification, Error>。如果successSignal火灾发送值,如果failedSinal火灾发送错误。

我不知道如何管理这个。

4

1 回答 1

0

这是一种方法:

enum SignalErrors: Error {
    case failedSignalValue
}

let failingFailed = failedSignal.flatMap(FlattenStrategy.latest) { _ in
    return SignalProducer<Int, SignalErrors>(error: SignalErrors.failedSignalValue)
}

对于这个新信号, 上的值failedSignal将被转换为error事件,因此事件现在到达failingFailed的信号也将作为而不是.failedSignal.failed.value

牢记事件流语法- 在一个.failed事件之后,信号终止!

let merged = Signal.merge([
    successSignal
        .promoteError(SignalErrors.self),
    failingFailed
])

然后我们将successSignalfailingFailed信号合并在一起。由于.failed事件的行为类似于异常并立即传播.failed,因此当事件到达时,整个合并信号也将立即失败failingFailed

出于类型检查的原因, on 是必需的promoteErrorsuccessSignal

于 2017-09-14T10:08:52.143 回答