2017-09-13 48 views
0

我有两个来自通知的信号。这些从外部框架中被解雇。如何结合两个信号或OR

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火灾发送错误。

我不知道如何管理这个。

回答

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

请记住Event Stream Grammar - 在一个.failed事件之后,Signal终止!

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

然后我们一起合并successSignalfailingFailed信号。 Since a .failed event behaves like an exception and propagates immediately,当.failed事件到达failingFailed时,整个合并信号也将立即失败。

successSignalpromoteError对于类型检查原因是必需的。