繁体   English   中英

ReactiveCocoa 3和ReactiveCocoa 4中的组播

[英]Multicasting in ReactiveCocoa 3 and ReactiveCocoa 4

假设我有一个返回SignalProducer<AnyObject?, NSError>的函数,并且我想将生产者绑定到多个MutableProperty<String> 因此,如下所示:

let foo = SignalProducer<AnyObject?, NSError>(value: nil)
let someProperty1 = MutableProperty<String>("")
let someProperty2 = MutableProperty<String>("")

someProperty1 <~ foo
    .flatMapError { _ in
        SignalProducer<AnyObject?, NoError>.empty
    }
    .map { _ in
        return "test"
    }

// someProperty2 <~ foo etc...

为了避免我的功能(例如某些网络设备)被多次运行,我将需要使用多播。 据我从CHANGELOG得知startWithSignal是用于此的运算符。 但是,我似乎无法弄清楚如何以声明的方式进行此操作。

因此,一种方法可能是在startWithSignal的关闭过程中进行startWithSignal

foo.startWithSignal { signal, disposable in
    someProperty1 <~ signal
        .map { _ in
            return "test"
        }

    // someProperty2 <~ signal etc...
}

但是,这显然会失败,因为我们需要摆脱NSError部分。 因为我们要提供一个Signal (与SignalProducer相对),所以我们不能使用flatMapError (在RAC4中,在RAC3中catch )。 而且我看不到mapError如何为我们做到这一点? 最后,我什至不确定这是否是在RAC3 / RAC4中处理多播的正确方法?

任何帮助深表感谢。

starWithSignal之前使用flatMapError (以及必须使用SignalProducer参数的任何其他运算符)

let fooIgnoreError = foo
    .flatMapError { _ in
        SignalProducer<AnyObject?, NoError>.empty
    }


fooIgnoreError.startWithSignal { signal, disposable in
    someProperty1 <~ signal.map { _ in "test" }
    someProperty2 <~ signal.map { _ in "test2" }
}

如果fooIgnoreError仅启动一次,则可以保证基础信号生成器foo也只能启动一次。

在这里通过示例解释了如何实现多播

对于错误,可以使属性AnyProperty<Result<Value, Error>>能够转发错误。 如果您希望信号在发生故障时终止,则只需

signal.flatMapError { error in 
    fatalError("Error: \(error)") // or some other form of error handling, or simply ignoring the error?
    return .empty
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM