假设我有一个返回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的结束处进行绑定:
foo.startWithSignal { signal, disposable in
    someProperty1 <~ signal
        .map { _ in
            return "test"
        }

    // someProperty2 <~ signal etc...
}

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

任何帮助深表感谢。

最佳答案

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

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也只能启动一次。

关于ios - ReactiveCocoa 3和ReactiveCocoa 4中的组播,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32791696/

10-09 09:58