作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个来自通知的信号。这些是从外部框架触发的。
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
触发发送错误。
我不知道如何管理这个。
最佳答案
有一种方法可以做到这一点:
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
])
然后我们将 successSignal
和 failingFailed
信号合并在一起。 Since a .failed
event behaves like an exception and propagates immediately ,当 .failed
事件到达 failingFailed
时,整个合并信号也会立即失败。
出于类型检查的原因,successSignal
上的 promoteError
是必需的。
关于ios - 如何用 OR 组合两个信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46200657/
我是一名优秀的程序员,十分优秀!