【问题标题】:How to combine two Signals with OR如何将两个信号与 OR 结合
【发布时间】:2017-09-13 14:50:11
【问题描述】:

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

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

我不知道如何管理。

【问题讨论】:

    标签: ios swift reactive-cocoa reactive-swift


    【解决方案1】:

    这是一种方法:

    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 事件之后,信号终止!

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

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

    出于类型检查的原因,successSignal 上的 promoteError 是必需的。

    【讨论】:

      猜你喜欢
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多